```r
require(phyloseq)
require(tidyverse)
require(phyloseq)
require(reshape2)
require(dplyr)
require(ggplot2)
require(microbiome)

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoiTG9hZGluZyByZXF1aXJlZCBwYWNrYWdlOiBtaWNyb2Jpb21lXG5XYXJuaW5nIGluIGxpYnJhcnkocGFja2FnZSwgbGliLmxvYyA9IGxpYi5sb2MsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSwgbG9naWNhbC5yZXR1cm4gPSBUUlVFLCAgOlxuICB0aGVyZSBpcyBubyBwYWNrYWdlIGNhbGxlZCDigJhtaWNyb2Jpb21l4oCZXG4ifQ== -->

Loading required package: microbiome Warning in library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, : there is no package called ‘microbiome’




<!-- rnb-output-end -->

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucmVxdWlyZSh2ZWdhbilcbmBgYFxuYGBgIn0= -->

```r
```r
require(vegan)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


Load data

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucHNfZG1uIDwtIHJlYWRSRFMoXCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvZGF0YS9QaHlsb3NlcU9iamVjdHMvSVRTL0RNTl9lc3RzX0lUUy5SZGF0YVwiKVxuYGBgIn0= -->

```r
ps_dmn <- readRDS("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/data/PhyloseqObjects/ITS/DMN_ests_ITS.Rdata")
Warning message:
In rm(list = objects, envir = env) : object '*tmp*' not found
sample_data(ps_dmn)$Herbicide <- factor(sample_data(ps_dmn)$Herbicide, levels = c("Aatrex", "Clarity", "Hand","Non-Treated","Roundup Powermax"))
sample_data(ps_dmn)$herb_time<-paste(sample_data(ps_dmn)$Herbicide, sample_data(ps_dmn)$Time, sep = "_")

#regroup all chemical treatments together and rerun betadiv calcs within group. 
sample_data(ps_dmn)$Mode<-sample_data(ps_dmn)$Herbicide

index <- c("Clarity", "Roundup Powermax", "Aatrex", "Hand", "Non-Treated")
values <- c("Chemical", "Chemical", "Chemical", "Hand", "Non-Treated")

sample_data(ps_dmn)$Mode<- as.factor(values[match(sample_data(ps_dmn)$Mode, index)])

index <- c("Clarity", "Roundup Powermax", "Aatrex", "Hand", "Non-Treated")
values <- c("Dicamba", "Glyphosate", "Atrazine-Mesotrione", "Handweeded", "Non-Treated")

sample_data(ps_dmn)$Herbicide <- as.factor(values[match(sample_data(ps_dmn)$Herbicide, index)])


ps_rare <- readRDS("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/data/PhyloseqObjects/ITS/HerbPt1_rare_ITS.Rdata")
sample_data(ps_rare)$Herbicide <- factor(sample_data(ps_rare)$Herbicide, levels = c("Aatrex", "Clarity", "Hand","Non-Treated","Roundup Powermax"))
sample_data(ps_rare)$herb_time<-paste(sample_data(ps_rare)$Herbicide, sample_data(ps_rare)$Time, sep = "_")


#regroup all chemical treatments together and rerun betadiv calcs within group. 
sample_data(ps_rare)$Mode<-sample_data(ps_rare)$Herbicide

index <- c("Clarity", "Roundup Powermax", "Aatrex", "Hand", "Non-Treated")
values <- c("Chemical", "Chemical", "Chemical", "Hand", "Non-Treated")

sample_data(ps_rare)$Mode<- as.factor(values[match(sample_data(ps_rare)$Mode, index)])

index <- c("Clarity", "Roundup Powermax", "Aatrex", "Hand", "Non-Treated")
values <- c("Dicamba", "Glyphosate", "Atrazine-Mesotrione", "Handweeded", "Non-Treated")

sample_data(ps_rare)$Herbicide <- as.factor(values[match(sample_data(ps_rare)$Herbicide, index)])


ps_trans <- readRDS("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/data/PhyloseqObjects/ITS/HerbPt1_hel_trans_ITS.Rdata")
sample_data(ps_trans)$Herbicide <- factor(sample_data(ps_trans)$Herbicide, levels = c("Aatrex", "Clarity", "Hand","Non-Treated","Roundup Powermax"))
sample_data(ps_trans)$herb_time<-paste(sample_data(ps_trans)$Herbicide, sample_data(ps_trans)$Time, sep = "_")


#regroup all chemical treatments together and rerun betadiv calcs within group. 
sample_data(ps_trans)$Mode<-sample_data(ps_trans)$Herbicide

index <- c("Clarity", "Roundup Powermax", "Aatrex", "Hand", "Non-Treated")
values <- c("Chemical", "Chemical", "Chemical", "Hand", "Non-Treated")

sample_data(ps_trans)$Mode<- as.factor(values[match(sample_data(ps_trans)$Mode, index)])

index <- c("Clarity", "Roundup Powermax", "Aatrex", "Hand", "Non-Treated")
values <- c("Dicamba", "Glyphosate", "Atrazine-Mesotrione", "Handweeded", "Non-Treated")

sample_data(ps_trans)$Herbicide <- as.factor(values[match(sample_data(ps_trans)$Herbicide, index)])

Remove samples that are outlines or under sequenced.

ps_dmn <-  subset_samples(ps_dmn, sample_names(ps_dmn) != "G009SG")
ps_dmn <-  subset_samples(ps_dmn, sample_names(ps_dmn) != "G095SG")
ps_dmn <-  subset_samples(ps_dmn, sample_names(ps_dmn) != "G123SG")
ps_dmn <-  subset_samples(ps_dmn, sample_names(ps_dmn) != "G129SG")

ps_rare <-  subset_samples(ps_rare, sample_names(ps_rare) != "G009SG")
ps_rare <-  subset_samples(ps_rare, sample_names(ps_rare) != "G095SG")
ps_rare <-  subset_samples(ps_rare, sample_names(ps_rare) != "G123SG")
ps_rare <-  subset_samples(ps_rare, sample_names(ps_rare) != "G129SG")
ps_rare_sub<-prune_taxa(taxa_sums(ps_rare) > 2, ps_rare)

ordinations and adonis testing with three separate objects (i.e., dmn, rarefied, transformed). Rare taxa are removed from rarefied and transformed to successfully ordinate. At this point, the transformed data will not ordinate. This section is full dataset ordinations.


ord_dmn<-ordinate(physeq = ps_dmn, method = "NMDS", distance = "bray", k=3, trymax= 300, maxit = 1000)
Run 0 stress 0.1637061 
Run 1 stress 0.1638069 
... Procrustes: rmse 0.04511874  max resid 0.2959219 
Run 2 stress 0.1639952 
... Procrustes: rmse 0.04572109  max resid 0.2996605 
Run 3 stress 0.1636993 
... New best solution
... Procrustes: rmse 0.003124  max resid 0.03552253 
Run 4 stress 0.1636321 
... New best solution
... Procrustes: rmse 0.01768586  max resid 0.1058303 
Run 5 stress 0.1634893 
... New best solution
... Procrustes: rmse 0.01749345  max resid 0.1018927 
Run 6 stress 0.1636166 
... Procrustes: rmse 0.04806717  max resid 0.3003009 
Run 7 stress 0.1633705 
... New best solution
... Procrustes: rmse 0.04470724  max resid 0.2996104 
Run 8 stress 0.1631225 
... New best solution
... Procrustes: rmse 0.01730151  max resid 0.1523431 
Run 9 stress 0.1636991 
Run 10 stress 0.1640706 
Run 11 stress 0.1635635 
... Procrustes: rmse 0.01665523  max resid 0.203607 
Run 12 stress 0.163487 
... Procrustes: rmse 0.04938977  max resid 0.2995861 
Run 13 stress 0.1642535 
Run 14 stress 0.1633718 
... Procrustes: rmse 0.01725707  max resid 0.1522712 
Run 15 stress 0.1640259 
Run 16 stress 0.1646096 
Run 17 stress 0.1634884 
... Procrustes: rmse 0.04947432  max resid 0.2997511 
Run 18 stress 0.1631224 
... New best solution
... Procrustes: rmse 0.001164614  max resid 0.007901557 
... Similar to previous best
Run 19 stress 0.1631223 
... New best solution
... Procrustes: rmse 0.000894574  max resid 0.007191738 
... Similar to previous best
Run 20 stress 0.1632532 
... Procrustes: rmse 0.007653146  max resid 0.08811271 
*** Solution reached
ord_rare<-ordinate(physeq = ps_rare_sub, method = "NMDS", distance = "bray", k=3, trymax= 300, maxit = 1000)
Square root transformation
Wisconsin double standardization
Run 0 stress 0.1837394 
Run 1 stress 0.1837536 
... Procrustes: rmse 0.004222286  max resid 0.03854408 
Run 2 stress 0.1859057 
Run 3 stress 0.1837379 
... New best solution
... Procrustes: rmse 0.0006553106  max resid 0.004505322 
... Similar to previous best
Run 4 stress 0.1856626 
Run 5 stress 0.1861936 
Run 6 stress 0.1862078 
Run 7 stress 0.1859133 
Run 8 stress 0.1837401 
... Procrustes: rmse 0.0007329372  max resid 0.004394223 
... Similar to previous best
Run 9 stress 0.1837556 
... Procrustes: rmse 0.004232884  max resid 0.03808415 
Run 10 stress 0.1837291 
... New best solution
... Procrustes: rmse 0.004668855  max resid 0.03839136 
Run 11 stress 0.1862108 
Run 12 stress 0.1856156 
Run 13 stress 0.1837321 
... Procrustes: rmse 0.001869121  max resid 0.0172899 
Run 14 stress 0.185933 
Run 15 stress 0.1859134 
Run 16 stress 0.1837366 
... Procrustes: rmse 0.003934702  max resid 0.03800597 
Run 17 stress 0.183736 
... Procrustes: rmse 0.004072096  max resid 0.03782902 
Run 18 stress 0.1862073 
Run 19 stress 0.1837283 
... New best solution
... Procrustes: rmse 0.003314344  max resid 0.02283046 
Run 20 stress 0.1861278 
Run 21 stress 0.1837368 
... Procrustes: rmse 0.004202959  max resid 0.03676119 
Run 22 stress 0.1862196 
Run 23 stress 0.1837526 
... Procrustes: rmse 0.002014267  max resid 0.0209574 
Run 24 stress 0.1837541 
... Procrustes: rmse 0.001993472  max resid 0.02133405 
Run 25 stress 0.183726 
... New best solution
... Procrustes: rmse 0.0003499443  max resid 0.002495313 
... Similar to previous best
*** Solution reached
ps_trans_sub<-prune_taxa(taxa_sums(ps_trans) > 0.01, ps_trans)
ord_transformed<-ordinate(physeq = ps_trans_sub, method = "NMDS", distance = "bray", k=3, trymax= 300, maxit = 1000)
Run 0 stress 0.1050141 
Run 1 stress 0.103327 
... New best solution
... Procrustes: rmse 0.03564627  max resid 0.1241836 
Run 2 stress 0.1033284 
... Procrustes: rmse 0.0004026237  max resid 0.003428707 
... Similar to previous best
Run 3 stress 0.1033322 
... Procrustes: rmse 0.000709747  max resid 0.004562807 
... Similar to previous best
Run 4 stress 0.1034339 
... Procrustes: rmse 0.00953169  max resid 0.05735493 
Run 5 stress 0.103324 
... New best solution
... Procrustes: rmse 0.002440901  max resid 0.0170954 
Run 6 stress 0.1034354 
... Procrustes: rmse 0.007967689  max resid 0.05434794 
Run 7 stress 0.1033282 
... Procrustes: rmse 0.00265007  max resid 0.01838042 
Run 8 stress 0.1034361 
... Procrustes: rmse 0.007981759  max resid 0.05521913 
Run 9 stress 0.1034359 
... Procrustes: rmse 0.008040017  max resid 0.05456366 
Run 10 stress 0.1033249 
... Procrustes: rmse 0.002039597  max resid 0.01573552 
Run 11 stress 0.1050151 
Run 12 stress 0.1034358 
... Procrustes: rmse 0.00800128  max resid 0.05441324 
Run 13 stress 0.1050135 
Run 14 stress 0.1068755 
Run 15 stress 0.1050132 
Run 16 stress 0.1033314 
... Procrustes: rmse 0.003020749  max resid 0.02047583 
Run 17 stress 0.1050126 
Run 18 stress 0.103327 
... Procrustes: rmse 0.002759821  max resid 0.02293387 
Run 19 stress 0.1033299 
... Procrustes: rmse 0.002844598  max resid 0.01951695 
Run 20 stress 0.103436 
... Procrustes: rmse 0.008047048  max resid 0.05456818 
Run 21 stress 0.1050133 
Run 22 stress 0.1050145 
Run 23 stress 0.1034335 
... Procrustes: rmse 0.007696545  max resid 0.05320767 
Run 24 stress 0.1050135 
Run 25 stress 0.1034323 
... Procrustes: rmse 0.007414607  max resid 0.05157759 
Run 26 stress 0.1033298 
... Procrustes: rmse 0.002836647  max resid 0.01947178 
Run 27 stress 0.1050129 
Run 28 stress 0.1050133 
Run 29 stress 0.1050146 
Run 30 stress 0.1033263 
... Procrustes: rmse 0.002509226  max resid 0.02018023 
Run 31 stress 0.103322 
... New best solution
... Procrustes: rmse 0.00036451  max resid 0.002650074 
... Similar to previous best
*** Solution reached

create alphadiversity tables

alpha_div_md$Herbicide 
  [1] Dicamba             Dicamba             Dicamba             Handweeded          Handweeded         
  [6] Handweeded          Non-Treated         Non-Treated         Atrazine-Mesotrione Atrazine-Mesotrione
 [11] Glyphosate          Glyphosate          Glyphosate          Glyphosate          Glyphosate         
 [16] Atrazine-Mesotrione Atrazine-Mesotrione Atrazine-Mesotrione Handweeded          Handweeded         
 [21] Dicamba             Dicamba             Dicamba             Non-Treated         Non-Treated        
 [26] Non-Treated         Non-Treated         Non-Treated         Non-Treated         Glyphosate         
 [31] Glyphosate          Glyphosate          Dicamba             Dicamba             Dicamba            
 [36] Atrazine-Mesotrione Atrazine-Mesotrione Handweeded          Handweeded          Handweeded         
 [41] Glyphosate          Glyphosate          Glyphosate          Handweeded          Handweeded         
 [46] Non-Treated         Non-Treated         Non-Treated         Dicamba             Dicamba            
 [51] Atrazine-Mesotrione Atrazine-Mesotrione Atrazine-Mesotrione Dicamba             Dicamba            
 [56] Handweeded          Handweeded          Handweeded          Non-Treated         Non-Treated        
 [61] Non-Treated         Atrazine-Mesotrione Atrazine-Mesotrione Atrazine-Mesotrione Glyphosate         
 [66] Glyphosate          Glyphosate          Glyphosate          Glyphosate          Glyphosate         
 [71] Atrazine-Mesotrione Atrazine-Mesotrione Atrazine-Mesotrione Handweeded          Handweeded         
 [76] Handweeded          Dicamba             Dicamba             Dicamba             Non-Treated        
 [81] Non-Treated         Non-Treated         Non-Treated         Glyphosate          Glyphosate         
 [86] Dicamba             Dicamba             Atrazine-Mesotrione Atrazine-Mesotrione Atrazine-Mesotrione
 [91] Handweeded          Handweeded          Handweeded          Glyphosate          Glyphosate         
 [96] Glyphosate          Handweeded          Handweeded          Non-Treated         Non-Treated        
[101] Non-Treated         Dicamba             Dicamba             Atrazine-Mesotrione Dicamba            
[106] Dicamba             Handweeded          Handweeded          Handweeded          Non-Treated        
[111] Non-Treated         Atrazine-Mesotrione Atrazine-Mesotrione Atrazine-Mesotrione Glyphosate         
[116] Glyphosate          Glyphosate          Glyphosate          Glyphosate          Atrazine-Mesotrione
[121] Atrazine-Mesotrione Atrazine-Mesotrione Handweeded          Handweeded          Handweeded         
[126] Dicamba             Dicamba             Dicamba             Non-Treated         Non-Treated        
[131] Non-Treated         Non-Treated         Non-Treated         Glyphosate          Glyphosate         
[136] Glyphosate          Dicamba             Dicamba             Dicamba             Atrazine-Mesotrione
[141] Atrazine-Mesotrione Atrazine-Mesotrione Handweeded          Handweeded          Glyphosate         
[146] Glyphosate          Glyphosate          Handweeded          Handweeded          Handweeded         
[151] Non-Treated         Non-Treated         Non-Treated         Dicamba             Atrazine-Mesotrione
[156] Atrazine-Mesotrione Atrazine-Mesotrione
Levels: Non-Treated Handweeded Atrazine-Mesotrione Dicamba Glyphosate

Shannon Div plots - no significant differences among herbicide treatments at any of the three time points

ggplot(data = alpha_div_md, aes(Herbicide, Shannon, color= Herbicide)) + facet_grid(. ~ Time) + geom_boxplot() + theme_classic() + theme(axis.text.x = element_text(angle = 45, hjust = 1) )

ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_Shannon.pdf")
Saving 7.29 x 4.51 in image

aov_t1<-aov(Shannon ~ Herbicide, data = alpha_div_md[alpha_div_md$Time == "T1",])
plot(aov_t1$residuals)

summary(aov_t1)
            Df Sum Sq Mean Sq F value Pr(>F)
Herbicide    4  0.389 0.09720    1.26  0.299
Residuals   48  3.704 0.07716               
aov_t2<-aov(Shannon~ Herbicide, data = alpha_div_md[alpha_div_md$Time == "T2",])
plot(aov_t2$residuals)

summary(aov_t2)
            Df Sum Sq Mean Sq F value Pr(>F)
Herbicide    4 0.1234 0.03086   0.508   0.73
Residuals   46 2.7936 0.06073               
aov_t3<-aov(Shannon ~ Herbicide, data = alpha_div_md[alpha_div_md$Time == "T3",])
plot(aov_t3$residuals)

summary(aov_t3)
            Df Sum Sq Mean Sq F value Pr(>F)  
Herbicide    4 0.5376 0.13440   2.551  0.051 .
Residuals   48 2.5287 0.05268                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
TukeyHSD(aov_t3, "Herbicide")
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = Shannon ~ Herbicide, data = alpha_div_md[alpha_div_md$Time == "T3", ])

$Herbicide
                                        diff         lwr       upr     p adj
Handweeded-Non-Treated           0.086844630 -0.19738244 0.3710717 0.9078666
Atrazine-Mesotrione-Non-Treated  0.129708505 -0.14882205 0.4082391 0.6803851
Dicamba-Non-Treated             -0.002861275 -0.30174872 0.2960262 0.9999999
Glyphosate-Non-Treated           0.273363070 -0.01086400 0.5575901 0.0647237
Atrazine-Mesotrione-Handweeded   0.042863876 -0.22867317 0.3144009 0.9914461
Dicamba-Handweeded              -0.089705904 -0.38208716 0.2026754 0.9066040
Glyphosate-Handweeded            0.186518440 -0.09085878 0.4638957 0.3282566
Dicamba-Atrazine-Mesotrione     -0.132569780 -0.41941651 0.1542769 0.6864852
Glyphosate-Atrazine-Mesotrione   0.143654565 -0.12788248 0.4151916 0.5679081
Glyphosate-Dicamba               0.276224345 -0.01615691 0.5686056 0.0724032

Adonis testing of herbicide treatments by time point

ps_adonis<-function(physeq){
  otu_tab<-data.frame(phyloseq::otu_table(physeq))
  md_tab<-data.frame(phyloseq::sample_data(physeq))
    if(taxa_are_rows(physeq)== T){
       physeq_dist<-parallelDist::parDist(as.matrix(t(otu_tab)), method = "bray")}
            else{physeq_dist<-parallelDist::parDist(as.matrix(otu_tab), method = "bray")}
  print(anova(vegan::betadisper(physeq_dist, md_tab$Herbicide)))
  vegan::adonis(physeq_dist ~ Herbicide * Time + Total_Weed_Veg , data = md_tab, permutations = 1000)
}
#ps_adonis(ps_rare_sub)
#remove one sample with no vegetation measurement. 
ps_rare_sub_57<-subset_samples(ps_rare_sub, sample_names(ps_rare_sub) != "G065SG")
ps_adonis(ps_rare_sub_57)
#ps_adonis(ps_trans_sub)
ps_dmn_57<-subset_samples(ps_dmn, sample_names(ps_dmn) != "G065SG")
#ps_adonis(ps_dmn)
ps_adonis(ps_dmn_57)

Ordination plots DMN by time point

ord_t1_dmn<-ordinate(physeq = subset_samples(ps_dmn, Time=="T1"), method = "NMDS", distance = "bray", k=3, trymax= 100)
Run 0 stress 0.1335559 
Run 1 stress 0.1309245 
... New best solution
... Procrustes: rmse 0.06976384  max resid 0.2060325 
Run 2 stress 0.1315098 
Run 3 stress 0.132755 
Run 4 stress 0.134753 
Run 5 stress 0.1308758 
... New best solution
... Procrustes: rmse 0.0538814  max resid 0.2344595 
Run 6 stress 0.1331698 
Run 7 stress 0.1323904 
Run 8 stress 0.1346675 
Run 9 stress 0.1350022 
Run 10 stress 0.1322358 
Run 11 stress 0.1334733 
Run 12 stress 0.1315248 
Run 13 stress 0.1331407 
Run 14 stress 0.1327605 
Run 15 stress 0.1332143 
Run 16 stress 0.1369199 
Run 17 stress 0.1339829 
Run 18 stress 0.1331858 
Run 19 stress 0.1360529 
Run 20 stress 0.1352334 
Run 21 stress 0.1308759 
... Procrustes: rmse 0.001713885  max resid 0.006848176 
... Similar to previous best
*** Solution reached
T1_dmn<-ggordiplots::gg_ordiplot(ord = ord_t1_dmn, groups = data.frame(sample_data(subset_samples(ps_dmn, Time == "T1")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)

T1_dmn$plot + theme_classic()

ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_dmn_T1.pdf")
Saving 7.29 x 4.51 in image

ord_t2_dmn<-ordinate(physeq = subset_samples(ps_dmn, Time=="T2"), method = "NMDS", distance = "bray", k=3, trymax= 100)
Run 0 stress 0.1325262 
Run 1 stress 0.1325269 
... Procrustes: rmse 0.0001074309  max resid 0.000408716 
... Similar to previous best
Run 2 stress 0.1325262 
... New best solution
... Procrustes: rmse 0.001015874  max resid 0.005488789 
... Similar to previous best
Run 3 stress 0.1327962 
... Procrustes: rmse 0.01038273  max resid 0.06195753 
Run 4 stress 0.1338926 
Run 5 stress 0.1392078 
Run 6 stress 0.1338929 
Run 7 stress 0.1325264 
... Procrustes: rmse 0.001066291  max resid 0.005401677 
... Similar to previous best
Run 8 stress 0.1325261 
... New best solution
... Procrustes: rmse 0.0001868934  max resid 0.001066974 
... Similar to previous best
Run 9 stress 0.1334238 
Run 10 stress 0.1325259 
... New best solution
... Procrustes: rmse 0.0007505591  max resid 0.004597761 
... Similar to previous best
Run 11 stress 0.132925 
... Procrustes: rmse 0.01264762  max resid 0.07728014 
Run 12 stress 0.1438152 
Run 13 stress 0.132526 
... Procrustes: rmse 0.0003451055  max resid 0.001743723 
... Similar to previous best
Run 14 stress 0.1325259 
... Procrustes: rmse 0.0003370863  max resid 0.00167214 
... Similar to previous best
Run 15 stress 0.1334866 
Run 16 stress 0.1325266 
... Procrustes: rmse 0.0009514394  max resid 0.005508805 
... Similar to previous best
Run 17 stress 0.1325265 
... Procrustes: rmse 0.0008955128  max resid 0.005161325 
... Similar to previous best
Run 18 stress 0.1449845 
Run 19 stress 0.1342762 
Run 20 stress 0.1325263 
... Procrustes: rmse 0.0003284059  max resid 0.001374251 
... Similar to previous best
*** Solution reached
T2_dmn<-ggordiplots::gg_ordiplot(ord = ord_t2_dmn, groups = data.frame(sample_data(subset_samples(ps_dmn, Time == "T2")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)

T2_dmn$plot + theme_classic()
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_dmn_T2.pdf")
Saving 7.29 x 4.51 in image

#this time point needs to be checked out. The ordination is not working properly. 
ord_t3_dmn<-ordinate(physeq = subset_samples(ps_dmn, Time=="T3"), method = "NMDS", distance = "bray", k=3, trymax= 100)
Run 0 stress 0.1451733 
Run 1 stress 0.1459287 
Run 2 stress 0.1510555 
Run 3 stress 0.1501906 
Run 4 stress 0.1503806 
Run 5 stress 0.1459215 
Run 6 stress 0.1528692 
Run 7 stress 0.1451733 
... Procrustes: rmse 0.00281782  max resid 0.01088482 
Run 8 stress 0.1502075 
Run 9 stress 0.1507344 
Run 10 stress 0.1478567 
Run 11 stress 0.1490906 
Run 12 stress 0.1451724 
... New best solution
... Procrustes: rmse 0.0002730257  max resid 0.001361369 
... Similar to previous best
Run 13 stress 0.1507808 
Run 14 stress 0.146477 
Run 15 stress 0.1510089 
Run 16 stress 0.1507665 
Run 17 stress 0.1518463 
Run 18 stress 0.1459425 
Run 19 stress 0.1451714 
... New best solution
... Procrustes: rmse 0.001928599  max resid 0.006972218 
... Similar to previous best
Run 20 stress 0.1459215 
*** Solution reached
T3_dmn<-ggordiplots::gg_ordiplot(ord = ord_t3_dmn, groups = data.frame(sample_data(subset_samples(ps_dmn, Time == "T3")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)

T3_dmn$plot + theme_classic()
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_dmn_T3.pdf")
Saving 7.29 x 4.51 in image

Ordination plots on rarefied data by time point.

ord_t1_rare<-ordinate(physeq = subset_samples(ps_rare_sub, Time=="T1"), method = "NMDS", distance = "bray", k=3, trymax= 100)
Square root transformation
Wisconsin double standardization
Run 0 stress 0.15407 
Run 1 stress 0.1547275 
Run 2 stress 0.1560278 
Run 3 stress 0.154304 
... Procrustes: rmse 0.01759432  max resid 0.08547907 
Run 4 stress 0.1552432 
Run 5 stress 0.1559291 
Run 6 stress 0.1560286 
Run 7 stress 0.1560271 
Run 8 stress 0.1540703 
... Procrustes: rmse 0.0005180512  max resid 0.002163285 
... Similar to previous best
Run 9 stress 0.1548105 
Run 10 stress 0.1540705 
... Procrustes: rmse 0.0005653613  max resid 0.002608133 
... Similar to previous best
Run 11 stress 0.1581519 
Run 12 stress 0.1559287 
Run 13 stress 0.1559305 
Run 14 stress 0.1595564 
Run 15 stress 0.1540698 
... New best solution
... Procrustes: rmse 0.0002352417  max resid 0.000845193 
... Similar to previous best
Run 16 stress 0.1585595 
Run 17 stress 0.1540701 
... Procrustes: rmse 0.0004692716  max resid 0.002323505 
... Similar to previous best
Run 18 stress 0.1541024 
... Procrustes: rmse 0.004124925  max resid 0.02278237 
Run 19 stress 0.1543293 
... Procrustes: rmse 0.008122859  max resid 0.02901827 
Run 20 stress 0.158152 
*** Solution reached
T1_rare<-ggordiplots::gg_ordiplot(ord = ord_t1_rare, groups = data.frame(sample_data(subset_samples(ps_rare, Time == "T1")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)

T1_rare$plot + theme_classic()

T1_rare<-ggordiplots::gg_ordiplot(ord = ord_t1_rare, groups = data.frame(sample_data(subset_samples(ps_rare, Time == "T1")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)

T1_rare_plot<-T1_rare$plot + theme_classic() + xlim(-0.5, 0.5) + ylim(-0.5, 0.5)  + guides(color=guide_legend("Treatment")) + xlab("NMDS 1") + ylab("NMDS 2")
T1_rare_plot
Warning: Removed 3 rows containing missing values (geom_point).

library(cowplot)
my_legend <- get_legend(T1_rare_plot)
Warning: Removed 3 rows containing missing values (geom_point).
library(ggpubr)
as_ggplot(my_legend)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordinationlegend.pdf")
Saving 7.29 x 4.51 in image

T1_rare_plot<-T1_rare_plot + theme(legend.position = "none")
T1_rare_plot
Warning: Removed 3 rows containing missing values (geom_point).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_rare_T1.pdf")
Saving 7.29 x 4.51 in image
Warning: Removed 3 rows containing missing values (geom_point).

ord_t2_rare<-ordinate(physeq = subset_samples(ps_rare_sub, Time=="T2"), method = "NMDS", distance = "bray", k=3, trymax= 100)
Square root transformation
Wisconsin double standardization
Run 0 stress 0.1716481 
Run 1 stress 0.1712224 
... New best solution
... Procrustes: rmse 0.07764546  max resid 0.2246421 
Run 2 stress 0.1706262 
... New best solution
... Procrustes: rmse 0.07905606  max resid 0.2661682 
Run 3 stress 0.1713448 
Run 4 stress 0.1709004 
... Procrustes: rmse 0.05656489  max resid 0.2944112 
Run 5 stress 0.1702319 
... New best solution
... Procrustes: rmse 0.06383277  max resid 0.2810499 
Run 6 stress 0.1706227 
... Procrustes: rmse 0.06377346  max resid 0.2806419 
Run 7 stress 0.1715869 
Run 8 stress 0.1713431 
Run 9 stress 0.1760045 
Run 10 stress 0.1710628 
Run 11 stress 0.1713372 
Run 12 stress 0.1709006 
Run 13 stress 0.1730992 
Run 14 stress 0.1721699 
Run 15 stress 0.1720581 
Run 16 stress 0.1702893 
... Procrustes: rmse 0.05501828  max resid 0.2833975 
Run 17 stress 0.1724195 
Run 18 stress 0.1707193 
... Procrustes: rmse 0.01192387  max resid 0.06232137 
Run 19 stress 0.170143 
... New best solution
... Procrustes: rmse 0.006859545  max resid 0.02883077 
Run 20 stress 0.172169 
Run 21 stress 0.1703025 
... Procrustes: rmse 0.05780913  max resid 0.2825995 
Run 22 stress 0.1709835 
Run 23 stress 0.1702878 
... Procrustes: rmse 0.05725869  max resid 0.2827813 
Run 24 stress 0.1706262 
... Procrustes: rmse 0.06561008  max resid 0.2790836 
Run 25 stress 0.1710053 
Run 26 stress 0.1715864 
Run 27 stress 0.1770233 
Run 28 stress 0.1728199 
Run 29 stress 0.1702891 
... Procrustes: rmse 0.0574152  max resid 0.2826642 
Run 30 stress 0.1736522 
Run 31 stress 0.1733041 
Run 32 stress 0.1712221 
Run 33 stress 0.1720533 
Run 34 stress 0.1733034 
Run 35 stress 0.1727863 
Run 36 stress 0.1762042 
Run 37 stress 0.1767485 
Run 38 stress 0.1710044 
Run 39 stress 0.1703045 
... Procrustes: rmse 0.05793853  max resid 0.2825322 
Run 40 stress 0.1701603 
... Procrustes: rmse 0.00243186  max resid 0.007204675 
... Similar to previous best
*** Solution reached
T2_rare<-ggordiplots::gg_ordiplot(ord = ord_t2_rare, groups = data.frame(sample_data(subset_samples(ps_rare, Time == "T2")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)

T2_rare_plot<-T2_rare$plot + theme_classic() + xlim(-0.5, 0.5) + ylim(-0.5, 0.5) + theme(legend.position = "none")  + xlab("NMDS 1") + ylab("NMDS 2")
T2_rare_plot
Warning: Removed 4 rows containing missing values (geom_point).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_rare_T2.pdf")
Saving 7.29 x 4.51 in image
Warning: Removed 4 rows containing missing values (geom_point).

ord_t3_rare<-ordinate(physeq = subset_samples(ps_rare, Time=="T3"), method = "NMDS", distance = "bray", k=3, trymax= 100)
Square root transformation
Wisconsin double standardization
Run 0 stress 0.1685562 
Run 1 stress 0.1748996 
Run 2 stress 0.1726844 
Run 3 stress 0.1728187 
Run 4 stress 0.1708916 
Run 5 stress 0.1723652 
Run 6 stress 0.1708747 
Run 7 stress 0.1718667 
Run 8 stress 0.1686699 
... Procrustes: rmse 0.009687857  max resid 0.05462871 
Run 9 stress 0.1684508 
... New best solution
... Procrustes: rmse 0.0119619  max resid 0.06653228 
Run 10 stress 0.1772936 
Run 11 stress 0.1687617 
... Procrustes: rmse 0.02053262  max resid 0.105457 
Run 12 stress 0.1686702 
... Procrustes: rmse 0.0151362  max resid 0.06254477 
Run 13 stress 0.1686729 
... Procrustes: rmse 0.02086917  max resid 0.1253609 
Run 14 stress 0.1792488 
Run 15 stress 0.1694632 
Run 16 stress 0.1696437 
Run 17 stress 0.170417 
Run 18 stress 0.1823142 
Run 19 stress 0.1687895 
... Procrustes: rmse 0.02300242  max resid 0.1239071 
Run 20 stress 0.1687873 
... Procrustes: rmse 0.02263201  max resid 0.1209943 
Run 21 stress 0.1723288 
Run 22 stress 0.1697892 
Run 23 stress 0.1694646 
Run 24 stress 0.1686697 
... Procrustes: rmse 0.01566615  max resid 0.06646188 
Run 25 stress 0.1720066 
Run 26 stress 0.1708448 
Run 27 stress 0.172342 
Run 28 stress 0.1708482 
Run 29 stress 0.1686102 
... Procrustes: rmse 0.01107215  max resid 0.06307271 
Run 30 stress 0.1686539 
... Procrustes: rmse 0.01829401  max resid 0.1088791 
Run 31 stress 0.1725083 
Run 32 stress 0.1729314 
Run 33 stress 0.1823118 
Run 34 stress 0.171603 
Run 35 stress 0.1684516 
... Procrustes: rmse 0.000333685  max resid 0.001749564 
... Similar to previous best
*** Solution reached
T3_rare<-ggordiplots::gg_ordiplot(ord = ord_t3_rare, groups = data.frame(sample_data(subset_samples(ps_rare, Time == "T3")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)

T3_rare_plot<-T3_rare$plot + theme_classic() + xlim(-0.5, 0.5) + ylim(-0.5, 0.5) + theme(legend.position = "none")  + xlab("NMDS 1") + ylab("NMDS 2")
T3_rare_plot
Warning: Removed 4 rows containing missing values (geom_point).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_rare_T3.pdf")
Saving 7.29 x 4.51 in image
Warning: Removed 4 rows containing missing values (geom_point).

library(ggpubr)
ggarrange(T1_rare_plot, T2_rare_plot, T3_rare_plot, ncol = 1)
Warning: Removed 3 rows containing missing values (geom_point).
Warning: Removed 4 rows containing missing values (geom_point).
Warning: Removed 4 rows containing missing values (geom_point).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_combined_ordination.pdf", width = 5, height = 10)

CAP ordination plots rarefied

t1_dist <- distance(subset_samples(ps_rare, Time=="T1"), method="bray") #get wUnifrac and save
t1_table<-as.matrix(dist(t1_dist)) #transform wUnifrac index
ord_t1_rare_cap <- capscale(t1_table ~ Herbicide, data.frame(sample_data(subset_samples(ps_rare, Time == "T1"))))
T1_rare<-ggordiplots::gg_ordiplot(ord = ord_t1_rare_cap, groups = data.frame(sample_data(subset_samples(ps_rare, Time == "T1")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)
T1_rare$plot + theme_classic()
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_rare_T1_cap.pdf")


t2_dist <- distance(subset_samples(ps_rare, Time=="T2"), method="bray") #get wUnifrac and save
t2_table<-as.matrix(dist(t2_dist)) #transform wUnifrac index
ord_t2_rare_cap <- capscale(t2_table ~ Herbicide, data.frame(sample_data(subset_samples(ps_rare, Time == "T2"))))
T2_rare<-ggordiplots::gg_ordiplot(ord = ord_t2_rare_cap, groups = data.frame(sample_data(subset_samples(ps_rare, Time == "T2")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)
T2_rare$plot + theme_classic()
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_rare_T2_cap.pdf")


#G166SG identified as outlier based on plots with it included. Removed to create plot. 
ps_rare <-  subset_samples(ps_rare, sample_names(ps_rare) != "G166SG")
t3_dist <- distance(subset_samples(ps_rare, Time=="T3"), method="bray") #get wUnifrac and save
t3_table<-as.matrix(dist(t3_dist)) #transform wUnifrac index
ord_t3_rare_cap <- capscale(t3_table ~ Herbicide, data.frame(sample_data(subset_samples(ps_rare, Time == "T3"))))
T3_rare<-ggordiplots::gg_ordiplot(ord = ord_t3_rare_cap, groups = data.frame(sample_data(subset_samples(ps_rare, Time == "T3")))$Herbicide, choices = c(1, 2), kind = c("se"), conf = 0.95, show.groups = "all", ellipse = TRUE, label = FALSE, hull = FALSE, spiders = FALSE, plot = TRUE, pt.size = 1)
T3_rare$plot + theme_classic()
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_ordination_rare_T3_cap.pdf")

Pairwise adonis testing no needed becasue of insignificant gloabal test.

ps_pairwiseadonis<-function(physeq){
  otu_tab<-data.frame(phyloseq::otu_table(physeq))
  md_tab<-data.frame(phyloseq::sample_data(physeq))
    if(taxa_are_rows(physeq)== T){
       physeq_dist<-parallelDist::parDist(as.matrix(t(otu_tab)), method = "bray")}
            else{physeq_dist<-parallelDist::parDist(as.matrix(otu_tab), method = "bray")}
pairwiseAdonis::pairwise.adonis(x = physeq_dist, factors = md_tab$Herbicide, p.adjust.m = "none", perm = 1000)
}

ps_t1<-subset_samples(ps_rare_sub, Time == "T1")
ps_t1<-prune_taxa(taxa_sums(ps_t1) > 2, ps_t1)

ps_t2<-subset_samples(ps_rare_sub, Time == "T2")
ps_t2<-prune_taxa(taxa_sums(ps_t2) > 2, ps_t2)

ps_t3<-subset_samples(ps_rare_sub, Time == "T3")
ps_t3<-prune_taxa(taxa_sums(ps_t3) > 2, ps_t3)


ps_pairwiseadonis(ps_t1)
ps_pairwiseadonis(ps_t2)
ps_pairwiseadonis(ps_t3)

Pairwise betadispr by treatment, time and mode

ps_betadispr<-function(physeq, groupingvar = "Groupingvar"){
  otu_tab<-data.frame(phyloseq::otu_table(physeq))
  md_tab<-data.frame(phyloseq::sample_data(physeq))
    if(taxa_are_rows(physeq)== T){
       physeq_dist<-parallelDist::parDist(as.matrix(t(otu_tab)), method = "bray")}
            else{physeq_dist<-parallelDist::parDist(as.matrix(otu_tab), method = "bray")}
                mod<-vegan::betadisper(physeq_dist, md_tab[,groupingvar])
        ## Perform test
                print(anova(mod))
        ## Permutation test for F
                pmod <- vegan::permutest(mod, permutations = 1000, pairwise = TRUE)
                print(pmod)
                print(boxplot(mod))
}

permute test of dispersion

ps_betadispr(subset_samples(ps_rare_sub, Time == "T1"), groupingvar = "Mode")
ps_betadispr(subset_samples(ps_rare_sub, Time == "T2"), groupingvar = "Mode")
ps_betadispr(subset_samples(ps_rare_sub, Time == "T3"), groupingvar = "Mode")

ps_betadispr(subset_samples(ps_rare_sub, Mode == "Chemical"), groupingvar = "Time")
ps_betadispr(subset_samples(ps_rare_sub, Mode == "Non-Treated"), groupingvar = "Time")
ps_betadispr(subset_samples(ps_rare_sub, Mode == "Hand"), groupingvar = "Time")


ps_betadispr(subset_samples(ps_rare_sub, Herbicide == "Glyphosate"), groupingvar = "Time")
ps_betadispr(subset_samples(ps_rare_sub, Herbicide == "Atrazine-Mesotrione"), groupingvar = "Time")
ps_betadispr(subset_samples(ps_rare_sub, Herbicide == "Dicamba"), groupingvar = "Time")
ps_betadispr(subset_samples(ps_rare_sub, Herbicide == "Handweeded"), groupingvar = "Time")
ps_betadispr(subset_samples(ps_rare_sub, Herbicide == "Non-Treated"), groupingvar = "Time")

ps_betadispr(ps_rare_sub, groupingvar = "Time")

Box and whisker plots of distance within group distances

#remotes::install_github("antonioggsousa/micrUBIfuns")
library(micrUBIfuns)
T1_beta<-beta_boxplot(physeq = subset_samples(ps_rare, Time=="T1"), method = "bray", group = "Herbicide")
T1_beta_plot <- T1_beta$plot
T1_beta_plot <- T1_beta_plot + theme_classic()+ guides(color=guide_legend("Treatment")) + ylab("Bray-Curtis Dissimilarity") + xlab("") + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylim (0.3, 0.75)
T1_beta_plot
Warning: Removed 5 rows containing non-finite values (stat_boxplot).
Warning: Removed 5 rows containing missing values (geom_point).

my_legend <- get_legend(T1_beta_plot)
Warning: Removed 5 rows containing non-finite values (stat_boxplot).
Warning: Removed 5 rows containing missing values (geom_point).
as_ggplot(my_legend)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_beta_legend.pdf")
Saving 7.29 x 4.51 in image

T1_beta_plot<-T1_beta_plot+ theme(legend.position = "none") 
T1_beta_plot
Warning: Removed 5 rows containing non-finite values (stat_boxplot).
Warning: Removed 5 rows containing missing values (geom_point).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_T1_rare_withingroup_beta.pdf")
Saving 7.29 x 4.51 in image
Warning: Removed 5 rows containing non-finite values (stat_boxplot).
Warning: Removed 5 rows containing missing values (geom_point).

T1_beta_df<- T1_beta$data
T1_betamod<-aov(formula = beta_div_value ~ group ,data = T1_beta_df)
summary(T1_betamod)
             Df Sum Sq Mean Sq F value  Pr(>F)    
group         4 0.2967 0.07419    8.83 1.1e-06 ***
Residuals   250 2.1003 0.00840                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
TukeyHSD(x = T1_betamod, which = "group")
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = beta_div_value ~ group, data = T1_beta_df)

$group
                                        diff         lwr          upr     p adj
Dicamba-Atrazine-Mesotrione     -0.027993939 -0.07861966  0.022631781 0.5508308
Glyphosate-Atrazine-Mesotrione  -0.036412121 -0.08703784  0.014213599 0.2806138
Handweeded-Atrazine-Mesotrione  -0.058666667 -0.11176337 -0.005569963 0.0220819
Non-Treated-Atrazine-Mesotrione  0.040006061 -0.01061966  0.090631781 0.1940292
Glyphosate-Dicamba              -0.008418182 -0.05644596  0.039609594 0.9889807
Handweeded-Dicamba              -0.030672727 -0.08129845  0.019952993 0.4576855
Non-Treated-Dicamba              0.068000000  0.01997222  0.116027775 0.0012035
Handweeded-Glyphosate           -0.022254545 -0.07288027  0.028371175 0.7468226
Non-Treated-Glyphosate           0.076418182  0.02839041  0.124445957 0.0001747
Non-Treated-Handweeded           0.098672727  0.04804701  0.149298448 0.0000019
T2_beta<-beta_boxplot(physeq = subset_samples(ps_rare, Time=="T2"), method = "bray", group = "Herbicide")
T2_beta_plot <- T2_beta$plot
T2_beta_plot <- T2_beta_plot+ theme_classic() + theme(legend.position = "none") + ylab("Bray-Curtis Dissimilarity") + xlab("") + ggtitle("") + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylim (0.3, 0.75)
T2_beta_plot
Warning: Removed 1 rows containing non-finite values (stat_boxplot).
Warning: Removed 1 rows containing missing values (geom_point).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_T2_rare_withingroup_beta.pdf")
Saving 7.29 x 4.51 in image
Warning: Removed 1 rows containing non-finite values (stat_boxplot).
Warning: Removed 1 rows containing missing values (geom_point).

T2_beta_df<- T2_beta$data
T2_betamod<-aov(formula = beta_div_value ~ group ,data = T2_beta_df)
summary(T2_betamod)
             Df Sum Sq  Mean Sq F value  Pr(>F)   
group         4  0.080 0.019995   4.367 0.00201 **
Residuals   231  1.058 0.004578                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
TukeyHSD(x = T2_betamod, which = "group")
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = beta_div_value ~ group, data = T2_beta_df)

$group
                                        diff          lwr           upr     p adj
Dicamba-Atrazine-Mesotrione     -0.029188889 -0.070787897  0.0124101197 0.3048204
Glyphosate-Atrazine-Mesotrione  -0.020375758 -0.057770485  0.0170189703 0.5647456
Handweeded-Atrazine-Mesotrione   0.022206061 -0.015188667  0.0596007884 0.4780643
Non-Treated-Atrazine-Mesotrione -0.015555556 -0.054775477  0.0236643659 0.8113359
Glyphosate-Dicamba               0.008813131 -0.031069709  0.0486959716 0.9738007
Handweeded-Dicamba               0.051394949  0.011512109  0.0912777898 0.0043255
Non-Treated-Dicamba              0.013633333 -0.027965675  0.0552323419 0.8962631
Handweeded-Glyphosate            0.042581818  0.007106064  0.0780575719 0.0097763
Non-Treated-Glyphosate           0.004820202 -0.032574526  0.0422149299 0.9966025
Non-Treated-Handweeded          -0.037761616 -0.075156344 -0.0003668883 0.0465006
T3_beta<-beta_boxplot(physeq = subset_samples(ps_rare, Time=="T3"), method = "bray", group = "Herbicide") 
T3_beta$plot #+ scale_color_manual(values = c("#F8766D", "#A3A500",  "#00BF7D", "#00B0F6", "#E76BF3")) + 
T3_beta_plot <- T3_beta$plot
T3_beta_plot <- T3_beta_plot + theme_classic()+ theme(legend.position = "none") + ylab("Bray-Curtis Dissimilarity") + xlab("") + ggtitle("")
T3_beta_plot <-T3_beta_plot + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylim (0.3, 0.75)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_T3_rare_withingroup_beta.pdf")
Saving 7.29 x 4.51 in image
Warning: Removed 1 rows containing non-finite values (stat_boxplot).
Warning: Removed 1 rows containing missing values (geom_point).

T3_beta_df<- T3_beta$data
T3_betamod<-aov(formula = beta_div_value ~ group ,data = T3_beta_df)
summary(T3_betamod)
             Df Sum Sq  Mean Sq F value Pr(>F)
group         4 0.0672 0.016792   1.689  0.153
Residuals   252 2.5054 0.009942               
TukeyHSD(x = T3_betamod, which = "group")
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = beta_div_value ~ group, data = T3_beta_df)

$group
                                        diff         lwr        upr     p adj
Dicamba-Atrazine-Mesotrione      0.009452020 -0.04731207 0.06621612 0.9909320
Glyphosate-Atrazine-Mesotrione  -0.037518182 -0.08753732 0.01250096 0.2404830
Handweeded-Atrazine-Mesotrione  -0.014736364 -0.06475550 0.03528278 0.9275528
Non-Treated-Atrazine-Mesotrione -0.023409091 -0.07637301 0.02955483 0.7430333
Glyphosate-Dicamba              -0.046970202 -0.10570358 0.01176317 0.1840580
Handweeded-Dicamba              -0.024188384 -0.08292176 0.03454499 0.7896781
Non-Treated-Dicamba             -0.032861111 -0.09412180 0.02839957 0.5804264
Handweeded-Glyphosate            0.022781818 -0.02946147 0.07502511 0.7524585
Non-Treated-Glyphosate           0.014109091 -0.04096017 0.06917835 0.9554583
Non-Treated-Handweeded          -0.008672727 -0.06374199 0.04639653 0.9926689
library(ggpubr)
ggarrange(T1_beta_plot, T2_beta_plot, T3_beta_plot, ncol = 1)
Warning: Removed 5 rows containing non-finite values (stat_boxplot).
Warning: Removed 5 rows containing missing values (geom_point).
Warning: Removed 1 rows containing non-finite values (stat_boxplot).
Warning: Removed 1 rows containing missing values (geom_point).
Warning: Removed 1 rows containing non-finite values (stat_boxplot).
Warning: Removed 1 rows containing missing values (geom_point).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_combined_rare_within_group_beta.pdf", width = 5, height = 10)

Examination of dissimliarity across time points by treatment and then again by all chemical treatments combined.

T1_beta_df$Time<-"T1"
T2_beta_df$Time<-"T2"
T3_beta_df$Time<-"T3"


beta_div_T1_T2_T3 <- rbind(T1_beta_df, T2_beta_df, T3_beta_df)

beta_anova<-function(data, Herbicide = "Herbicide"){
  df_sub<- data %>% filter(group == Herbicide)
  mod<-aov(beta_div_value ~ Time, data = df_sub)
  print(summary(mod))
  print(TukeyHSD(mod, "Time"))
  boxplot(df_sub$beta_div_value ~ df_sub$Time)
}

beta_anova(beta_div_T1_T2_T3, Herbicide = "Non-Treated")
             Df Sum Sq Mean Sq F value   Pr(>F)    
Time          2  0.234 0.11699   13.48 4.36e-06 ***
Residuals   142  1.232 0.00868                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = beta_div_value ~ Time, data = df_sub)

$Time
             diff         lwr         upr     p adj
T2-T1 -0.09016162 -0.13451209 -0.04581115 0.0000111
T3-T1 -0.07307273 -0.11742320 -0.02872226 0.0004285
T3-T2  0.01708889 -0.02942628  0.06360405 0.6599624

beta_anova(beta_div_T1_T2_T3, Herbicide = "Handweeded")
             Df Sum Sq  Mean Sq F value Pr(>F)  
Time          2 0.0558 0.027878   4.704 0.0104 *
Residuals   152 0.9009 0.005927                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = beta_div_value ~ Time, data = df_sub)

$Time
             diff          lwr        upr     p adj
T2-T1  0.04627273  0.009645196 0.08290026 0.0090758
T3-T1  0.03427273 -0.002354804 0.07090026 0.0719037
T3-T2 -0.01200000 -0.046747927 0.02274793 0.6928413

beta_anova(beta_div_T1_T2_T3, Herbicide = "Dicamba")
             Df Sum Sq Mean Sq F value  Pr(>F)   
Time          2 0.0733 0.03664    5.34 0.00596 **
Residuals   124 0.8507 0.00686                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = beta_div_value ~ Time, data = df_sub)

$Time
             diff         lwr         upr     p adj
T2-T1 -0.03579495 -0.07791783 0.006327933 0.1126414
T3-T1  0.02778838 -0.01433450 0.069911266 0.2647095
T3-T2  0.06358333  0.01727131 0.109895354 0.0041226

beta_anova(beta_div_T1_T2_T3, Herbicide = "Atrazine-Mesotrione")
             Df Sum Sq Mean Sq F value Pr(>F)
Time          2 0.0292 0.01458     1.3  0.276
Residuals   153 1.7163 0.01122               
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = beta_div_value ~ Time, data = df_sub)

$Time
              diff         lwr        upr     p adj
T2-T1 -0.034600000 -0.08744615 0.01824615 0.2708607
T3-T1 -0.009657576 -0.05811807 0.03880292 0.8847098
T3-T2  0.024942424 -0.02351807 0.07340292 0.4442906

beta_anova(beta_div_T1_T2_T3, Herbicide = "Glyphosate")
             Df Sum Sq  Mean Sq F value Pr(>F)
Time          2 0.0096 0.004779   0.804  0.449
Residuals   162 0.9632 0.005945               
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = beta_div_value ~ Time, data = df_sub)

$Time
             diff         lwr        upr     p adj
T2-T1 -0.01856364 -0.05334455 0.01621728 0.4184568
T3-T1 -0.01076364 -0.04554455 0.02401728 0.7448495
T3-T2  0.00780000 -0.02698091 0.04258091 0.8564946

#regroup all chemical treatments together and rerun betadiv calcs within group. 
sample_data(ps_rare)$Mode<-sample_data(ps_rare)$Herbicide

index <- c("Dicamba", "Glyphosate", "Atrazine-Mesotrione", "Handweeded", "Non-Treated")
values <- c("Chemical", "Chemical", "Chemical", "Handweeded", "Non-Treated")

sample_data(ps_rare)$Mode<- as.factor(values[match(sample_data(ps_rare)$Mode, index)])

#+ scale_color_manual(values = c("#FFA500", "#00B0F6", "#E76BF3")) 


T1_beta_chemical_combined<-beta_boxplot(physeq = subset_samples(ps_rare, Time=="T1"), method = "bray", group = "Mode")
T1_beta_chemical_combined_plot <- T1_beta_chemical_combined$plot 
T1_beta_chemical_combined_plot<- T1_beta_chemical_combined_plot + theme_classic() + guides(color=guide_legend("Treatment")) + ylab("Bray-Curtis Dissimilarity") + xlab("") + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylim (0.5, 0.75) + scale_color_manual(values = c("#FFA500", "#00B0F6", "#E76BF3")) 
T1_beta_chemical_combined_plot
Warning: Removed 353 rows containing non-finite values (stat_boxplot).
Warning: Removed 354 rows containing missing values (geom_point).

my_legend <- get_legend(T1_beta_chemical_combined_plot)
Warning: Removed 353 rows containing non-finite values (stat_boxplot).
Warning: Removed 353 rows containing missing values (geom_point).
as_ggplot(my_legend)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_beta_combined_legend.pdf")
Saving 7.29 x 4.51 in image

T1_beta_chemical_combined_plot<-T1_beta_chemical_combined_plot+ theme(legend.position = "none")
T1_beta_chemical_combined_plot
Warning: Removed 353 rows containing non-finite values (stat_boxplot).
Warning: Removed 353 rows containing missing values (geom_point).

T2_beta_chemical_combined<-beta_boxplot(physeq = subset_samples(ps_rare, Time=="T2"), method = "bray", group = "Mode")
T2_beta_chemical_combined_plot <- T2_beta_chemical_combined$plot 
T2_beta_chemical_combined_plot<- T2_beta_chemical_combined_plot + theme_classic()+ theme(legend.position = "none") + ylab("Bray-Curtis Dissimilarity") + xlab("") + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylim (0.5, 0.75) + scale_color_manual(values = c("#FFA500", "#00B0F6", "#E76BF3")) 
T2_beta_chemical_combined_plot
Warning: Removed 373 rows containing non-finite values (stat_boxplot).
Warning: Removed 374 rows containing missing values (geom_point).

T3_beta_chemical_combined<-beta_boxplot(physeq = subset_samples(ps_rare, Time=="T3"), method = "bray", group = "Mode")
T3_beta_chemical_combined_plot <- T3_beta_chemical_combined$plot 
T3_beta_chemical_combined_plot<- T3_beta_chemical_combined_plot + theme_classic()+ theme(legend.position = "none") + ylab("Bray-Curtis Dissimilarity") + xlab("") + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylim (0.5, 0.75) + scale_color_manual(values = c("#FFA500", "#00B0F6", "#E76BF3")) 
T3_beta_chemical_combined_plot
Warning: Removed 348 rows containing non-finite values (stat_boxplot).
Warning: Removed 349 rows containing missing values (geom_point).

ggarrange(T1_beta_chemical_combined_plot, T2_beta_chemical_combined_plot, T3_beta_chemical_combined_plot, ncol = 1)
Warning: Removed 353 rows containing non-finite values (stat_boxplot).
Warning: Removed 354 rows containing missing values (geom_point).
Warning: Removed 373 rows containing non-finite values (stat_boxplot).
Warning: Removed 375 rows containing missing values (geom_point).
Warning: Removed 348 rows containing non-finite values (stat_boxplot).
Warning: Removed 350 rows containing missing values (geom_point).
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_combined_rare_within_group_beta_chemical_combined.pdf", width = 5, height = 10)


T1_beta_df_chemical_combined <- T1_beta_chemical_combined$data
T2_beta_df_chemical_combined<- T2_beta_chemical_combined$data
T3_beta_df_chemical_combined<- T3_beta_chemical_combined$data

T1_beta_df_chemical_combined$Time<-"T1"
T2_beta_df_chemical_combined$Time<-"T2"
T3_beta_df_chemical_combined$Time<-"T3"

m1<-aov(beta_div_value ~ group, data = T1_beta_df_chemical_combined)
summary(m1)
TukeyHSD(m1, "group")
boxplot(beta_div_value ~ group, data = T1_beta_df_chemical_combined)


m2<-aov(beta_div_value ~ group, data = T2_beta_df_chemical_combined)
summary(m2)
TukeyHSD(m2, "group")
boxplot(beta_div_value ~ group, data = T2_beta_df_chemical_combined)

m3<-aov(beta_div_value ~ group, data = T3_beta_df_chemical_combined)
summary(m3)
TukeyHSD(m3, "group")
boxplot(beta_div_value ~ group, data = T3_beta_df_chemical_combined)


beta_div__chemical_combined_T1_T2_T3 <- rbind(T1_beta_df_chemical_combined, T2_beta_df_chemical_combined, T3_beta_df_chemical_combined)

beta_anova(beta_div__chemical_combined_T1_T2_T3, Herbicide = "Chemical")
beta_anova(beta_div__chemical_combined_T1_T2_T3, Herbicide = "Hand")
beta_anova(beta_div__chemical_combined_T1_T2_T3, Herbicide = "Non-Treated")

treatment to control



plotDistances = function(p, m, s, d) {

  # calc distances
  wu = phyloseq::distance(p, m)
  wu.m = melt(as.matrix(wu))
  
  # remove self-comparisons
  wu.m = wu.m %>%
    filter(as.character(Var1) != as.character(Var2)) %>%
    mutate_if(is.factor,as.character)
  
  # get sample data (S4 error OK and expected)
  sd = data.frame(sample_data(p)) %>%
    select(s, d) %>%
    mutate_if(is.factor,as.character)
  sd$Herbicide <- factor(sd$Herbicide, levels = c("Non-Treated", "Hand", "Aatrex", "Clarity", "Roundup Powermax"))
  
  # combined distances with sample data
  colnames(sd) = c("Var1", "Type1")
  wu.sd = left_join(wu.m, sd, by = "Var1")
  
  colnames(sd) = c("Var2", "Type2")
  wu.sd = left_join(wu.sd, sd, by = "Var2")
  
  #remove this line to plot all comparisons. 
  wu.sd = wu.sd %>% filter(Type1 == "Hand" | Type1 == "Non-Treated")
  
  # plot
  ggplot(wu.sd, aes(x = Type2, y = value)) +
    theme_bw() +
    geom_point() +
    geom_boxplot(aes(color = ifelse(Type1 == Type2, "red", "black"))) +
    scale_color_identity() +
    facet_wrap(~ Type1, scales = "free_x") +
    theme(axis.text.x=element_text(angle = 45, hjust = 1, size = 5)) + 
    ggtitle(paste0("Distance Metric = ", m))
  
}
a<-plotDistances(p = subset_samples(physeq= ps_rare, Time=="T1"), m = "bray", s = "Barcode_ID_G", d = "Herbicide")
a <- a + ggtitle("Time 1 Bray-Curtis Dissimlarities")
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_T1_rare_allgroup_beta.pdf")
b<-plotDistances(p = subset_samples(physeq= ps_rare, Time=="T2"), m = "bray", s = "Barcode_ID_G", d = "Herbicide")
b <-b + ggtitle("Time 2 Bray-Curtis Dissimlarities")
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_T2_rare_allgroup_beta.pdf")
c<-plotDistances(p = subset_samples(physeq= ps_rare, Time=="T3"), m = "bray", s = "Barcode_ID_G", d = "Herbicide")
c<- c + ggtitle("Time 3 Bray-Curtis Dissimlarities")
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_T3_rare_allgroup_beta.pdf")

library(ggpubr)
ggarrange(a, b, c, ncol = 1)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_combined_rare_allgroup_beta.pdf", width = 7, height = 12)

Taxon abundance bar plot

#create super long color vector
col_vector <- c("#000000", "#FFFF00", "#1CE6FF", "#FF34FF", "#FF4A46", "#008941", "#006FA6", "#A30059",
        "#FFDBE5", "#7A4900", "#0000A6", "#63FFAC", "#B79762", "#004D43", "#8FB0FF", "#997D87",
        "#5A0007", "#809693", "#FEFFE6", "#1B4400", "#4FC601", "#3B5DFF", "#4A3B53", "#FF2F80",
        "#61615A", "#BA0900", "#6B7900", "#00C2A0", "#FFAA92", "#FF90C9", "#B903AA", "#D16100",
        "#DDEFFF", "#000035", "#7B4F4B", "#A1C299", "#300018", "#0AA6D8", "#013349", "#00846F",
        "#372101", "#FFB500", "#C2FFED", "#A079BF", "#CC0744", "#C0B9B2", "#C2FF99", "#001E09",
        "#00489C", "#6F0062", "#0CBD66", "#EEC3FF", "#456D75", "#B77B68", "#7A87A1", "#788D66",
        "#885578", "#FAD09F", "#FF8A9A", "#D157A0", "#BEC459", "#456648", "#0086ED", "#886F4C",
        
        "#34362D", "#B4A8BD", "#00A6AA", "#452C2C", "#636375", "#A3C8C9", "#FF913F", "#938A81",
        "#575329", "#00FECF", "#B05B6F", "#8CD0FF", "#3B9700", "#04F757", "#C8A1A1", "#1E6E00",
        "#7900D7", "#A77500", "#6367A9", "#A05837", "#6B002C", "#772600", "#D790FF", "#9B9700",
        "#549E79", "#FFF69F", "#201625", "#72418F", "#BC23FF", "#99ADC0", "#3A2465", "#922329",
        "#5B4534", "#FDE8DC", "#404E55", "#0089A3", "#CB7E98", "#A4E804", "#324E72", "#6A3A4C",
        "#83AB58", "#001C1E", "#D1F7CE", "#004B28", "#C8D0F6", "#A3A489", "#806C66", "#222800",
        "#BF5650", "#E83000", "#66796D", "#DA007C", "#FF1A59", "#8ADBB4", "#1E0200", "#5B4E51",
        "#C895C5", "#320033", "#FF6832", "#66E1D3", "#CFCDAC", "#D0AC94", "#7ED379", "#012C58",
        
        "#7A7BFF", "#D68E01", "#353339", "#78AFA1", "#FEB2C6", "#75797C", "#837393", "#943A4D",
        "#B5F4FF", "#D2DCD5", "#9556BD", "#6A714A", "#001325", "#02525F", "#0AA3F7", "#E98176",
        "#DBD5DD", "#5EBCD1", "#3D4F44", "#7E6405", "#02684E", "#962B75", "#8D8546", "#9695C5",
        "#E773CE", "#D86A78", "#3E89BE", "#CA834E", "#518A87", "#5B113C", "#55813B", "#E704C4",
        "#00005F", "#A97399", "#4B8160", "#59738A", "#FF5DA7", "#F7C9BF", "#643127", "#513A01",
        "#6B94AA", "#51A058", "#A45B02", "#1D1702", "#E20027", "#E7AB63", "#4C6001", "#9C6966",
        "#64547B", "#97979E", "#006A66", "#391406", "#F4D749", "#0045D2", "#006C31", "#DDB6D0",
        "#7C6571", "#9FB2A4", "#00D891", "#15A08A", "#BC65E9", "#FFFFFE", "#C6DC99", "#203B3C",

        "#671190", "#6B3A64", "#F5E1FF", "#FFA0F2", "#CCAA35", "#374527", "#8BB400", "#797868",
        "#C6005A", "#3B000A", "#C86240", "#29607C", "#402334", "#7D5A44", "#CCB87C", "#B88183",
        "#AA5199", "#B5D6C3", "#A38469", "#9F94F0", "#A74571", "#B894A6", "#71BB8C", "#00B433",
        "#789EC9", "#6D80BA", "#953F00", "#5EFF03", "#E4FFFC", "#1BE177", "#BCB1E5", "#76912F",
        "#003109", "#0060CD", "#D20096", "#895563", "#29201D", "#5B3213", "#A76F42", "#89412E",
        "#1A3A2A", "#494B5A", "#A88C85", "#F4ABAA", "#A3F3AB", "#00C6C8", "#EA8B66", "#958A9F",
        "#BDC9D2", "#9FA064", "#BE4700", "#658188", "#83A485", "#453C23", "#47675D", "#3A3F00",
        "#061203", "#DFFB71", "#868E7E", "#98D058", "#6C8F7D", "#D7BFC2", "#3C3E6E", "#D83D66",

        "#2F5D9B", "#6C5E46", "#D25B88", "#5B656C", "#00B57F", "#545C46", "#866097", "#365D25",
        "#252F99", "#00CCFF", "#674E60", "#FC009C", "#92896B")
phylumGlommed <- tax_glom(ps_rare, "Phylum")

#t1
phylumGlommed_herb_t1 <- merge_samples(subset_samples(physeq= phylumGlommed, Time=="T1"), group = "Herbicide")
phylumGlommed_herb_t1 <- transform_sample_counts(phylumGlommed_herb_t1, function(OTU) OTU/sum(OTU))
sample_data(phylumGlommed_herb_t1)$Herbicide <- factor(sample_data(phylumGlommed_herb_t1)$Herbicide, levels = c(1, 2, 3, 4, 5), 
       labels = c("Non-Treated", "Hand", "Aatrex", "Clarity", "Roundup Powermax"))

plot_bar(phylumGlommed_herb_t1, x = "Herbicide", fill = "Phylum")  + theme_classic() + ggtitle("Proportional Taxon Abundances Time 1") +
theme(legend.position="bottom") + guides(fill=guide_legend(nrow=6)) + geom_bar(stat="identity") + theme(axis.text.x=element_text(angle = 45, hjust = 1, size = 5)) + 
scale_fill_manual(values = col_vector)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_Taxon_barplot_t1.pdf")

#t2
phylumGlommed_herb_t2 <- merge_samples(subset_samples(physeq= phylumGlommed, Time=="T2"), group = "Herbicide")
phylumGlommed_herb_t2 <- transform_sample_counts(phylumGlommed_herb_t2, function(OTU) OTU/sum(OTU))
sample_data(phylumGlommed_herb_t2)$Herbicide <- factor(sample_data(phylumGlommed_herb_t2)$Herbicide, levels = c(1, 2, 3, 4, 5), 
       labels = c("Non-Treated", "Hand", "Aatrex", "Clarity", "Roundup Powermax"))

plot_bar(phylumGlommed_herb_t2, x = "Herbicide", fill = "Phylum")  + theme_classic() + ggtitle("Proportional Taxon Abundances Time 1") +
theme(legend.position="bottom") + guides(fill=guide_legend(nrow=6)) + geom_bar(stat="identity") + theme(axis.text.x=element_text(angle = 45, hjust = 1, size = 5)) + 
scale_fill_manual(values = col_vector)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_Pt1/Figures/ITS_Taxon_barplot_t2.pdf")

#t3
phylumGlommed_herb_t3 <- merge_samples(subset_samples(physeq= phylumGlommed, Time=="T3"), group = "Herbicide")
phylumGlommed_herb_t3 <- transform_sample_counts(phylumGlommed_herb_t3, function(OTU) OTU/sum(OTU))
sample_data(phylumGlommed_herb_t3)$Herbicide <- factor(sample_data(phylumGlommed_herb_t3)$Herbicide, levels = c(1, 2, 3, 4, 5), 
       labels = c("Non-Treated", "Hand", "Aatrex", "Clarity", "Roundup Powermax"))

plot_bar(phylumGlommed_herb_t3, x = "Herbicide", fill = "Phylum")  + theme_classic() + ggtitle("Proportional Taxon Abundances Time 1") +
theme(legend.position="bottom") + guides(fill=guide_legend(nrow=6)) + geom_bar(stat="identity") + theme(axis.text.x=element_text(angle = 45, hjust = 1, size = 5)) + 
scale_fill_manual(values = col_vector)
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_Pt1/Figures/ITS_Taxon_barplot_t3.pdf")

Combined herbicide and time bar plot

sample_data(ps_rare_sub)$herb_time<-paste(sample_data(ps_rare_sub)$Herbicide, sample_data(ps_rare_sub)$Time, sep = "_")
ps_rare_for_barplot <- prune_taxa(taxa_sums(ps_rare_sub) > 50, ps_rare_sub)
plot_bar(ps_rare_for_barplot, x= "herb_time", fill = "Family") + scale_fill_manual(values = col_vector) + geom_bar(stat="identity")
ggsave("/Users/gordoncuster/Desktop/Git_Projects/Herbicide_Microbes_PT1/Figures/ITS_BarPlot_Herbicide_Time.pdf", width = 20, height = 11)

Linear modeling of abundant taxa


Tax_glom_Subset <- function (physeq, y = "taxLevel", nreturns = "Number of returns"){
   ps_1<- tax_glom(ps_rare_sub, taxrank = y )
    myTaxa <- names(sort(taxa_sums(ps_1), decreasing = TRUE)[1:nreturns])
       ps_1_sub <- prune_taxa(myTaxa, ps_1)
  return(ps_1_sub)
}

ps_rare_family_top25<-Tax_glom_Subset(physeq = ps_rare, nreturns = 25, y = "Family")
ps_rare_order_top10<-Tax_glom_Subset(physeq = ps_rare, nreturns = 10, y = "Order")

#explore top 25 taxa with plot bar
plot_bar(ps_rare_family_top25, x= "herb_time", fill = "Family") + scale_fill_manual(values = col_vector) + geom_bar(stat="identity")
plot_bar(ps_rare_order_top10, x= "herb_time", fill = "Order") + scale_fill_manual(values = col_vector) + geom_bar(stat="identity")


#write function to wrangle data prior to anova

abund_aov_wrangle <- function (physeq, y = "Tax_Level"){
  tax<-tax_table(physeq)[,y]
   meta<-data.frame(sample_data(physeq))
  counts<-data.frame(otu_table(physeq))
  rownames(counts) <- tax[,1]
  counts<-data.frame(t(counts))
   counts$Time <- meta$Time 
   counts$Herbicide <- meta$Herbicide 
  counts$Herb_time <- meta$herb_time 
  return(counts)
}            

test<-abund_aov_wrangle(ps_rare_family_top25, y = "Family")

mod_abund<-function(count_tab, IV = "Groups to be tested") {
   for(j in 1:length(unique(count_tab[,"Herbicide"]))){
         data <- count_tab %>% filter(Herbicide == unique(count_tab$Herbicide)[j])
           #change this to the number of returns from the tax_glom_subset function
   for (i in 1:25) { 
            mod <- aov(unlist(data[i]) ~ matrix(data[,IV])) 
            #sanity check
            #print(c(j, i))
   if(summary(mod)[[1]][["Pr(>F)"]][1] <= 0.05) {
    print(summary(mod))
     print(c(as.character(unique(count_tab[,"Herbicide"]))[j], names(data)[i]))
              boxplot(unlist(data[i]) ~ unlist(data[IV]), main =paste(names(data[i]), as.character(unique(count_tab[,"Herbicide"]))[j]), xlab= "Time", ylab="Abundance") 
           }
         }
      }
    }


mod_abund(test, IV = "Time")


#explore 
ps_rare_certabosidiacae <- subset_taxa(ps_rare, Family == "f:Ceratobasidiaceae")
plot_bar(ps_rare_certabosidiacae, x= "herb_time") + scale_fill_manual(values = col_vector)
LS0tCnRpdGxlOiAiSGVyYlB0MSAxNlMgRmlndXJlcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CnJlcXVpcmUocGh5bG9zZXEpCnJlcXVpcmUodGlkeXZlcnNlKQpyZXF1aXJlKHBoeWxvc2VxKQpyZXF1aXJlKHJlc2hhcGUyKQpyZXF1aXJlKGRwbHlyKQpyZXF1aXJlKGdncGxvdDIpCnJlcXVpcmUobWljcm9iaW9tZSkKcmVxdWlyZSh2ZWdhbikKYGBgCgpMb2FkIGRhdGEKYGBge3J9CnBzX2RtbiA8LSByZWFkUkRTKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvZGF0YS9QaHlsb3NlcU9iamVjdHMvSVRTL0RNTl9lc3RzX0lUUy5SZGF0YSIpCnNhbXBsZV9kYXRhKHBzX2RtbikkSGVyYmljaWRlIDwtIGZhY3RvcihzYW1wbGVfZGF0YShwc19kbW4pJEhlcmJpY2lkZSwgbGV2ZWxzID0gYygiQWF0cmV4IiwgIkNsYXJpdHkiLCAiSGFuZCIsIk5vbi1UcmVhdGVkIiwiUm91bmR1cCBQb3dlcm1heCIpKQpzYW1wbGVfZGF0YShwc19kbW4pJGhlcmJfdGltZTwtcGFzdGUoc2FtcGxlX2RhdGEocHNfZG1uKSRIZXJiaWNpZGUsIHNhbXBsZV9kYXRhKHBzX2RtbikkVGltZSwgc2VwID0gIl8iKQoKI3JlZ3JvdXAgYWxsIGNoZW1pY2FsIHRyZWF0bWVudHMgdG9nZXRoZXIgYW5kIHJlcnVuIGJldGFkaXYgY2FsY3Mgd2l0aGluIGdyb3VwLiAKc2FtcGxlX2RhdGEocHNfZG1uKSRNb2RlPC1zYW1wbGVfZGF0YShwc19kbW4pJEhlcmJpY2lkZQoKaW5kZXggPC0gYygiQ2xhcml0eSIsICJSb3VuZHVwIFBvd2VybWF4IiwgIkFhdHJleCIsICJIYW5kIiwgIk5vbi1UcmVhdGVkIikKdmFsdWVzIDwtIGMoIkNoZW1pY2FsIiwgIkNoZW1pY2FsIiwgIkNoZW1pY2FsIiwgIkhhbmQiLCAiTm9uLVRyZWF0ZWQiKQoKc2FtcGxlX2RhdGEocHNfZG1uKSRNb2RlPC0gYXMuZmFjdG9yKHZhbHVlc1ttYXRjaChzYW1wbGVfZGF0YShwc19kbW4pJE1vZGUsIGluZGV4KV0pCgppbmRleCA8LSBjKCJDbGFyaXR5IiwgIlJvdW5kdXAgUG93ZXJtYXgiLCAiQWF0cmV4IiwgIkhhbmQiLCAiTm9uLVRyZWF0ZWQiKQp2YWx1ZXMgPC0gYygiRGljYW1iYSIsICJHbHlwaG9zYXRlIiwgIkF0cmF6aW5lLU1lc290cmlvbmUiLCAiSGFuZHdlZWRlZCIsICJOb24tVHJlYXRlZCIpCgpzYW1wbGVfZGF0YShwc19kbW4pJEhlcmJpY2lkZSA8LSBhcy5mYWN0b3IodmFsdWVzW21hdGNoKHNhbXBsZV9kYXRhKHBzX2RtbikkSGVyYmljaWRlLCBpbmRleCldKQoKCnBzX3JhcmUgPC0gcmVhZFJEUygiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL2RhdGEvUGh5bG9zZXFPYmplY3RzL0lUUy9IZXJiUHQxX3JhcmVfSVRTLlJkYXRhIikKc2FtcGxlX2RhdGEocHNfcmFyZSkkSGVyYmljaWRlIDwtIGZhY3RvcihzYW1wbGVfZGF0YShwc19yYXJlKSRIZXJiaWNpZGUsIGxldmVscyA9IGMoIkFhdHJleCIsICJDbGFyaXR5IiwgIkhhbmQiLCJOb24tVHJlYXRlZCIsIlJvdW5kdXAgUG93ZXJtYXgiKSkKc2FtcGxlX2RhdGEocHNfcmFyZSkkaGVyYl90aW1lPC1wYXN0ZShzYW1wbGVfZGF0YShwc19yYXJlKSRIZXJiaWNpZGUsIHNhbXBsZV9kYXRhKHBzX3JhcmUpJFRpbWUsIHNlcCA9ICJfIikKCgojcmVncm91cCBhbGwgY2hlbWljYWwgdHJlYXRtZW50cyB0b2dldGhlciBhbmQgcmVydW4gYmV0YWRpdiBjYWxjcyB3aXRoaW4gZ3JvdXAuIApzYW1wbGVfZGF0YShwc19yYXJlKSRNb2RlPC1zYW1wbGVfZGF0YShwc19yYXJlKSRIZXJiaWNpZGUKCmluZGV4IDwtIGMoIkNsYXJpdHkiLCAiUm91bmR1cCBQb3dlcm1heCIsICJBYXRyZXgiLCAiSGFuZCIsICJOb24tVHJlYXRlZCIpCnZhbHVlcyA8LSBjKCJDaGVtaWNhbCIsICJDaGVtaWNhbCIsICJDaGVtaWNhbCIsICJIYW5kIiwgIk5vbi1UcmVhdGVkIikKCnNhbXBsZV9kYXRhKHBzX3JhcmUpJE1vZGU8LSBhcy5mYWN0b3IodmFsdWVzW21hdGNoKHNhbXBsZV9kYXRhKHBzX3JhcmUpJE1vZGUsIGluZGV4KV0pCgppbmRleCA8LSBjKCJDbGFyaXR5IiwgIlJvdW5kdXAgUG93ZXJtYXgiLCAiQWF0cmV4IiwgIkhhbmQiLCAiTm9uLVRyZWF0ZWQiKQp2YWx1ZXMgPC0gYygiRGljYW1iYSIsICJHbHlwaG9zYXRlIiwgIkF0cmF6aW5lLU1lc290cmlvbmUiLCAiSGFuZHdlZWRlZCIsICJOb24tVHJlYXRlZCIpCgpzYW1wbGVfZGF0YShwc19yYXJlKSRIZXJiaWNpZGUgPC0gYXMuZmFjdG9yKHZhbHVlc1ttYXRjaChzYW1wbGVfZGF0YShwc19yYXJlKSRIZXJiaWNpZGUsIGluZGV4KV0pCgoKcHNfdHJhbnMgPC0gcmVhZFJEUygiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL2RhdGEvUGh5bG9zZXFPYmplY3RzL0lUUy9IZXJiUHQxX2hlbF90cmFuc19JVFMuUmRhdGEiKQpzYW1wbGVfZGF0YShwc190cmFucykkSGVyYmljaWRlIDwtIGZhY3RvcihzYW1wbGVfZGF0YShwc190cmFucykkSGVyYmljaWRlLCBsZXZlbHMgPSBjKCJBYXRyZXgiLCAiQ2xhcml0eSIsICJIYW5kIiwiTm9uLVRyZWF0ZWQiLCJSb3VuZHVwIFBvd2VybWF4IikpCnNhbXBsZV9kYXRhKHBzX3RyYW5zKSRoZXJiX3RpbWU8LXBhc3RlKHNhbXBsZV9kYXRhKHBzX3RyYW5zKSRIZXJiaWNpZGUsIHNhbXBsZV9kYXRhKHBzX3RyYW5zKSRUaW1lLCBzZXAgPSAiXyIpCgoKI3JlZ3JvdXAgYWxsIGNoZW1pY2FsIHRyZWF0bWVudHMgdG9nZXRoZXIgYW5kIHJlcnVuIGJldGFkaXYgY2FsY3Mgd2l0aGluIGdyb3VwLiAKc2FtcGxlX2RhdGEocHNfdHJhbnMpJE1vZGU8LXNhbXBsZV9kYXRhKHBzX3RyYW5zKSRIZXJiaWNpZGUKCmluZGV4IDwtIGMoIkNsYXJpdHkiLCAiUm91bmR1cCBQb3dlcm1heCIsICJBYXRyZXgiLCAiSGFuZCIsICJOb24tVHJlYXRlZCIpCnZhbHVlcyA8LSBjKCJDaGVtaWNhbCIsICJDaGVtaWNhbCIsICJDaGVtaWNhbCIsICJIYW5kIiwgIk5vbi1UcmVhdGVkIikKCnNhbXBsZV9kYXRhKHBzX3RyYW5zKSRNb2RlPC0gYXMuZmFjdG9yKHZhbHVlc1ttYXRjaChzYW1wbGVfZGF0YShwc190cmFucykkTW9kZSwgaW5kZXgpXSkKCmluZGV4IDwtIGMoIkNsYXJpdHkiLCAiUm91bmR1cCBQb3dlcm1heCIsICJBYXRyZXgiLCAiSGFuZCIsICJOb24tVHJlYXRlZCIpCnZhbHVlcyA8LSBjKCJEaWNhbWJhIiwgIkdseXBob3NhdGUiLCAiQXRyYXppbmUtTWVzb3RyaW9uZSIsICJIYW5kd2VlZGVkIiwgIk5vbi1UcmVhdGVkIikKCnNhbXBsZV9kYXRhKHBzX3RyYW5zKSRIZXJiaWNpZGUgPC0gYXMuZmFjdG9yKHZhbHVlc1ttYXRjaChzYW1wbGVfZGF0YShwc190cmFucykkSGVyYmljaWRlLCBpbmRleCldKQpgYGAKClJlbW92ZSBzYW1wbGVzIHRoYXQgYXJlIG91dGxpbmVzIG9yIHVuZGVyIHNlcXVlbmNlZC4gCmBgYHtyfQpwc19kbW4gPC0gIHN1YnNldF9zYW1wbGVzKHBzX2Rtbiwgc2FtcGxlX25hbWVzKHBzX2RtbikgIT0gIkcwMDlTRyIpCnBzX2RtbiA8LSAgc3Vic2V0X3NhbXBsZXMocHNfZG1uLCBzYW1wbGVfbmFtZXMocHNfZG1uKSAhPSAiRzA5NVNHIikKcHNfZG1uIDwtICBzdWJzZXRfc2FtcGxlcyhwc19kbW4sIHNhbXBsZV9uYW1lcyhwc19kbW4pICE9ICJHMTIzU0ciKQpwc19kbW4gPC0gIHN1YnNldF9zYW1wbGVzKHBzX2Rtbiwgc2FtcGxlX25hbWVzKHBzX2RtbikgIT0gIkcxMjlTRyIpCgpwc19yYXJlIDwtICBzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBzYW1wbGVfbmFtZXMocHNfcmFyZSkgIT0gIkcwMDlTRyIpCnBzX3JhcmUgPC0gIHN1YnNldF9zYW1wbGVzKHBzX3JhcmUsIHNhbXBsZV9uYW1lcyhwc19yYXJlKSAhPSAiRzA5NVNHIikKcHNfcmFyZSA8LSAgc3Vic2V0X3NhbXBsZXMocHNfcmFyZSwgc2FtcGxlX25hbWVzKHBzX3JhcmUpICE9ICJHMTIzU0ciKQpwc19yYXJlIDwtICBzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBzYW1wbGVfbmFtZXMocHNfcmFyZSkgIT0gIkcxMjlTRyIpCnBzX3JhcmVfc3ViPC1wcnVuZV90YXhhKHRheGFfc3Vtcyhwc19yYXJlKSA+IDIsIHBzX3JhcmUpCmBgYAoKb3JkaW5hdGlvbnMgYW5kIGFkb25pcyB0ZXN0aW5nIHdpdGggdGhyZWUgc2VwYXJhdGUgb2JqZWN0cyAoaS5lLiwgZG1uLCByYXJlZmllZCwgdHJhbnNmb3JtZWQpLiBSYXJlIHRheGEgYXJlIHJlbW92ZWQgZnJvbSByYXJlZmllZCBhbmQgdHJhbnNmb3JtZWQgdG8gc3VjY2Vzc2Z1bGx5IG9yZGluYXRlLiBBdCB0aGlzIHBvaW50LCB0aGUgdHJhbnNmb3JtZWQgZGF0YSB3aWxsIG5vdCBvcmRpbmF0ZS4gVGhpcyBzZWN0aW9uIGlzIGZ1bGwgZGF0YXNldCBvcmRpbmF0aW9ucy4gCmBgYHtyfQoKb3JkX2Rtbjwtb3JkaW5hdGUocGh5c2VxID0gcHNfZG1uLCBtZXRob2QgPSAiTk1EUyIsIGRpc3RhbmNlID0gImJyYXkiLCBrPTMsIHRyeW1heD0gMzAwLCBtYXhpdCA9IDEwMDApCgpvcmRfcmFyZTwtb3JkaW5hdGUocGh5c2VxID0gcHNfcmFyZV9zdWIsIG1ldGhvZCA9ICJOTURTIiwgZGlzdGFuY2UgPSAiYnJheSIsIGs9MywgdHJ5bWF4PSAzMDAsIG1heGl0ID0gMTAwMCkKCnBzX3RyYW5zX3N1YjwtcHJ1bmVfdGF4YSh0YXhhX3N1bXMocHNfdHJhbnMpID4gMC4wMSwgcHNfdHJhbnMpCm9yZF90cmFuc2Zvcm1lZDwtb3JkaW5hdGUocGh5c2VxID0gcHNfdHJhbnNfc3ViLCBtZXRob2QgPSAiTk1EUyIsIGRpc3RhbmNlID0gImJyYXkiLCBrPTMsIHRyeW1heD0gMzAwLCBtYXhpdCA9IDEwMDApCmBgYAoKY3JlYXRlIGFscGhhZGl2ZXJzaXR5IHRhYmxlcwpgYGB7cn0Kc2FtcGxlX3N1bXMocHNfcmFyZSkKcHNfcmFyZQphbHBoYV9kaXYgPC0gZXN0aW1hdGVfcmljaG5lc3MocGh5c2VxID0gcHNfcmFyZSwgbWVhc3VyZXMgPSBjKCJPYnNlcnZlZCIsICJTaGFubm9uIiwgIkNoYW8xIikpCiNwdWxsIG91dCBtZXRhZGF0YSBhbmQgY29uY2F0b25hdGUgd2l0aCBhbHBoYSBkaXZlcnNpdHkgbWV0cmljcwptZDwtZGF0YS5mcmFtZShzYW1wbGVfZGF0YShwc19yYXJlKSkKYWxwaGFfZGl2X21kIDwtIHJvd25hbWVzX3RvX2NvbHVtbihhbHBoYV9kaXYsICJCYXJjb2RlX0lEX0ciKSAlPiUgZnVsbF9qb2luKG1kKSAKYWxwaGFfZGl2X21kJEhlcmJpY2lkZSA8LSBmYWN0b3IoYWxwaGFfZGl2X21kJEhlcmJpY2lkZSwgbGV2ZWxzID0gYygiTm9uLVRyZWF0ZWQiLCAiSGFuZHdlZWRlZCIsICJBdHJhemluZS1NZXNvdHJpb25lIiwgIkRpY2FtYmEiLCAiR2x5cGhvc2F0ZSIpKQpgYGAKCgoKU2hhbm5vbiBEaXYgcGxvdHMgLSBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBhbW9uZyBoZXJiaWNpZGUgdHJlYXRtZW50cyBhdCBhbnkgb2YgdGhlIHRocmVlIHRpbWUgcG9pbnRzCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGFscGhhX2Rpdl9tZCwgYWVzKEhlcmJpY2lkZSwgU2hhbm5vbiwgY29sb3I9IEhlcmJpY2lkZSkpICsgZmFjZXRfZ3JpZCguIH4gVGltZSkgKyBnZW9tX2JveHBsb3QoKSArIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkgKQoKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfU2hhbm5vbi5wZGYiKQoKYW92X3QxPC1hb3YoU2hhbm5vbiB+IEhlcmJpY2lkZSwgZGF0YSA9IGFscGhhX2Rpdl9tZFthbHBoYV9kaXZfbWQkVGltZSA9PSAiVDEiLF0pCnBsb3QoYW92X3QxJHJlc2lkdWFscykKc3VtbWFyeShhb3ZfdDEpCgphb3ZfdDI8LWFvdihTaGFubm9ufiBIZXJiaWNpZGUsIGRhdGEgPSBhbHBoYV9kaXZfbWRbYWxwaGFfZGl2X21kJFRpbWUgPT0gIlQyIixdKQpwbG90KGFvdl90MiRyZXNpZHVhbHMpCnN1bW1hcnkoYW92X3QyKQoKYW92X3QzPC1hb3YoU2hhbm5vbiB+IEhlcmJpY2lkZSwgZGF0YSA9IGFscGhhX2Rpdl9tZFthbHBoYV9kaXZfbWQkVGltZSA9PSAiVDMiLF0pCnBsb3QoYW92X3QzJHJlc2lkdWFscykKc3VtbWFyeShhb3ZfdDMpClR1a2V5SFNEKGFvdl90MywgIkhlcmJpY2lkZSIpCmBgYAoKCkFkb25pcyB0ZXN0aW5nIG9mIGhlcmJpY2lkZSB0cmVhdG1lbnRzIGJ5IHRpbWUgcG9pbnQKYGBge3J9CnBzX2Fkb25pczwtZnVuY3Rpb24ocGh5c2VxKXsKICBvdHVfdGFiPC1kYXRhLmZyYW1lKHBoeWxvc2VxOjpvdHVfdGFibGUocGh5c2VxKSkKICBtZF90YWI8LWRhdGEuZnJhbWUocGh5bG9zZXE6OnNhbXBsZV9kYXRhKHBoeXNlcSkpCiAgICBpZih0YXhhX2FyZV9yb3dzKHBoeXNlcSk9PSBUKXsKICAgICAgIHBoeXNlcV9kaXN0PC1wYXJhbGxlbERpc3Q6OnBhckRpc3QoYXMubWF0cml4KHQob3R1X3RhYikpLCBtZXRob2QgPSAiYnJheSIpfQogICAgICAgICAgICBlbHNle3BoeXNlcV9kaXN0PC1wYXJhbGxlbERpc3Q6OnBhckRpc3QoYXMubWF0cml4KG90dV90YWIpLCBtZXRob2QgPSAiYnJheSIpfQogIHByaW50KGFub3ZhKHZlZ2FuOjpiZXRhZGlzcGVyKHBoeXNlcV9kaXN0LCBtZF90YWIkSGVyYmljaWRlKSkpCiAgdmVnYW46OmFkb25pcyhwaHlzZXFfZGlzdCB+IEhlcmJpY2lkZSAqIFRpbWUgKyBUb3RhbF9XZWVkX1ZlZyAsIGRhdGEgPSBtZF90YWIsIHBlcm11dGF0aW9ucyA9IDEwMDApCn0KYGBgCgpgYGB7cn0KI3BzX2Fkb25pcyhwc19yYXJlX3N1YikKI3JlbW92ZSBvbmUgc2FtcGxlIHdpdGggbm8gdmVnZXRhdGlvbiBtZWFzdXJlbWVudC4gCnBzX3JhcmVfc3ViXzU3PC1zdWJzZXRfc2FtcGxlcyhwc19yYXJlX3N1Yiwgc2FtcGxlX25hbWVzKHBzX3JhcmVfc3ViKSAhPSAiRzA2NVNHIikKcHNfYWRvbmlzKHBzX3JhcmVfc3ViXzU3KQojcHNfYWRvbmlzKHBzX3RyYW5zX3N1YikKcHNfZG1uXzU3PC1zdWJzZXRfc2FtcGxlcyhwc19kbW4sIHNhbXBsZV9uYW1lcyhwc19kbW4pICE9ICJHMDY1U0ciKQojcHNfYWRvbmlzKHBzX2RtbikKcHNfYWRvbmlzKHBzX2Rtbl81NykKYGBgCgpPcmRpbmF0aW9uIHBsb3RzIERNTiBieSB0aW1lIHBvaW50CmBgYHtyfQpvcmRfdDFfZG1uPC1vcmRpbmF0ZShwaHlzZXEgPSBzdWJzZXRfc2FtcGxlcyhwc19kbW4sIFRpbWU9PSJUMSIpLCBtZXRob2QgPSAiTk1EUyIsIGRpc3RhbmNlID0gImJyYXkiLCBrPTMsIHRyeW1heD0gMTAwKQpUMV9kbW48LWdnb3JkaXBsb3RzOjpnZ19vcmRpcGxvdChvcmQgPSBvcmRfdDFfZG1uLCBncm91cHMgPSBkYXRhLmZyYW1lKHNhbXBsZV9kYXRhKHN1YnNldF9zYW1wbGVzKHBzX2RtbiwgVGltZSA9PSAiVDEiKSkpJEhlcmJpY2lkZSwgY2hvaWNlcyA9IGMoMSwgMiksIGtpbmQgPSBjKCJzZSIpLCBjb25mID0gMC45NSwgc2hvdy5ncm91cHMgPSAiYWxsIiwgZWxsaXBzZSA9IFRSVUUsIGxhYmVsID0gRkFMU0UsIGh1bGwgPSBGQUxTRSwgc3BpZGVycyA9IEZBTFNFLCBwbG90ID0gVFJVRSwgcHQuc2l6ZSA9IDEpClQxX2RtbiRwbG90ICsgdGhlbWVfY2xhc3NpYygpCgpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19vcmRpbmF0aW9uX2Rtbl9UMS5wZGYiKQoKb3JkX3QyX2Rtbjwtb3JkaW5hdGUocGh5c2VxID0gc3Vic2V0X3NhbXBsZXMocHNfZG1uLCBUaW1lPT0iVDIiKSwgbWV0aG9kID0gIk5NRFMiLCBkaXN0YW5jZSA9ICJicmF5Iiwgaz0zLCB0cnltYXg9IDEwMCkKVDJfZG1uPC1nZ29yZGlwbG90czo6Z2dfb3JkaXBsb3Qob3JkID0gb3JkX3QyX2RtbiwgZ3JvdXBzID0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShzdWJzZXRfc2FtcGxlcyhwc19kbW4sIFRpbWUgPT0gIlQyIikpKSRIZXJiaWNpZGUsIGNob2ljZXMgPSBjKDEsIDIpLCBraW5kID0gYygic2UiKSwgY29uZiA9IDAuOTUsIHNob3cuZ3JvdXBzID0gImFsbCIsIGVsbGlwc2UgPSBUUlVFLCBsYWJlbCA9IEZBTFNFLCBodWxsID0gRkFMU0UsIHNwaWRlcnMgPSBGQUxTRSwgcGxvdCA9IFRSVUUsIHB0LnNpemUgPSAxKQpUMl9kbW4kcGxvdCArIHRoZW1lX2NsYXNzaWMoKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19vcmRpbmF0aW9uX2Rtbl9UMi5wZGYiKQoKCiN0aGlzIHRpbWUgcG9pbnQgbmVlZHMgdG8gYmUgY2hlY2tlZCBvdXQuIFRoZSBvcmRpbmF0aW9uIGlzIG5vdCB3b3JraW5nIHByb3Blcmx5LiAKb3JkX3QzX2Rtbjwtb3JkaW5hdGUocGh5c2VxID0gc3Vic2V0X3NhbXBsZXMocHNfZG1uLCBUaW1lPT0iVDMiKSwgbWV0aG9kID0gIk5NRFMiLCBkaXN0YW5jZSA9ICJicmF5Iiwgaz0zLCB0cnltYXg9IDEwMCkKVDNfZG1uPC1nZ29yZGlwbG90czo6Z2dfb3JkaXBsb3Qob3JkID0gb3JkX3QzX2RtbiwgZ3JvdXBzID0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShzdWJzZXRfc2FtcGxlcyhwc19kbW4sIFRpbWUgPT0gIlQzIikpKSRIZXJiaWNpZGUsIGNob2ljZXMgPSBjKDEsIDIpLCBraW5kID0gYygic2UiKSwgY29uZiA9IDAuOTUsIHNob3cuZ3JvdXBzID0gImFsbCIsIGVsbGlwc2UgPSBUUlVFLCBsYWJlbCA9IEZBTFNFLCBodWxsID0gRkFMU0UsIHNwaWRlcnMgPSBGQUxTRSwgcGxvdCA9IFRSVUUsIHB0LnNpemUgPSAxKQpUM19kbW4kcGxvdCArIHRoZW1lX2NsYXNzaWMoKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19vcmRpbmF0aW9uX2Rtbl9UMy5wZGYiKQpgYGAKCk9yZGluYXRpb24gcGxvdHMgb24gcmFyZWZpZWQgZGF0YSBieSB0aW1lIHBvaW50LiAKYGBge3J9Cm9yZF90MV9yYXJlPC1vcmRpbmF0ZShwaHlzZXEgPSBzdWJzZXRfc2FtcGxlcyhwc19yYXJlX3N1YiwgVGltZT09IlQxIiksIG1ldGhvZCA9ICJOTURTIiwgZGlzdGFuY2UgPSAiYnJheSIsIGs9MywgdHJ5bWF4PSAxMDApClQxX3JhcmU8LWdnb3JkaXBsb3RzOjpnZ19vcmRpcGxvdChvcmQgPSBvcmRfdDFfcmFyZSwgZ3JvdXBzID0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBUaW1lID09ICJUMSIpKSkkSGVyYmljaWRlLCBjaG9pY2VzID0gYygxLCAyKSwga2luZCA9IGMoInNlIiksIGNvbmYgPSAwLjk1LCBzaG93Lmdyb3VwcyA9ICJhbGwiLCBlbGxpcHNlID0gVFJVRSwgbGFiZWwgPSBGQUxTRSwgaHVsbCA9IEZBTFNFLCBzcGlkZXJzID0gRkFMU0UsIHBsb3QgPSBUUlVFLCBwdC5zaXplID0gMSkKVDFfcmFyZSRwbG90ICsgdGhlbWVfY2xhc3NpYygpClQxX3JhcmU8LWdnb3JkaXBsb3RzOjpnZ19vcmRpcGxvdChvcmQgPSBvcmRfdDFfcmFyZSwgZ3JvdXBzID0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBUaW1lID09ICJUMSIpKSkkSGVyYmljaWRlLCBjaG9pY2VzID0gYygxLCAyKSwga2luZCA9IGMoInNlIiksIGNvbmYgPSAwLjk1LCBzaG93Lmdyb3VwcyA9ICJhbGwiLCBlbGxpcHNlID0gVFJVRSwgbGFiZWwgPSBGQUxTRSwgaHVsbCA9IEZBTFNFLCBzcGlkZXJzID0gRkFMU0UsIHBsb3QgPSBUUlVFLCBwdC5zaXplID0gMSkKVDFfcmFyZV9wbG90PC1UMV9yYXJlJHBsb3QgKyB0aGVtZV9jbGFzc2ljKCkgKyB4bGltKC0wLjUsIDAuNSkgKyB5bGltKC0wLjUsIDAuNSkgICsgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZCgiVHJlYXRtZW50IikpICsgeGxhYigiTk1EUyAxIikgKyB5bGFiKCJOTURTIDIiKQpUMV9yYXJlX3Bsb3QKbGlicmFyeShjb3dwbG90KQpteV9sZWdlbmQgPC0gZ2V0X2xlZ2VuZChUMV9yYXJlX3Bsb3QpCmxpYnJhcnkoZ2dwdWJyKQphc19nZ3Bsb3QobXlfbGVnZW5kKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19vcmRpbmF0aW9ubGVnZW5kLnBkZiIpClQxX3JhcmVfcGxvdDwtVDFfcmFyZV9wbG90ICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpUMV9yYXJlX3Bsb3QKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfb3JkaW5hdGlvbl9yYXJlX1QxLnBkZiIpCgpvcmRfdDJfcmFyZTwtb3JkaW5hdGUocGh5c2VxID0gc3Vic2V0X3NhbXBsZXMocHNfcmFyZV9zdWIsIFRpbWU9PSJUMiIpLCBtZXRob2QgPSAiTk1EUyIsIGRpc3RhbmNlID0gImJyYXkiLCBrPTMsIHRyeW1heD0gMTAwKQpUMl9yYXJlPC1nZ29yZGlwbG90czo6Z2dfb3JkaXBsb3Qob3JkID0gb3JkX3QyX3JhcmUsIGdyb3VwcyA9IGRhdGEuZnJhbWUoc2FtcGxlX2RhdGEoc3Vic2V0X3NhbXBsZXMocHNfcmFyZSwgVGltZSA9PSAiVDIiKSkpJEhlcmJpY2lkZSwgY2hvaWNlcyA9IGMoMSwgMiksIGtpbmQgPSBjKCJzZSIpLCBjb25mID0gMC45NSwgc2hvdy5ncm91cHMgPSAiYWxsIiwgZWxsaXBzZSA9IFRSVUUsIGxhYmVsID0gRkFMU0UsIGh1bGwgPSBGQUxTRSwgc3BpZGVycyA9IEZBTFNFLCBwbG90ID0gVFJVRSwgcHQuc2l6ZSA9IDEpClQyX3JhcmVfcGxvdDwtVDJfcmFyZSRwbG90ICsgdGhlbWVfY2xhc3NpYygpICsgeGxpbSgtMC41LCAwLjUpICsgeWxpbSgtMC41LCAwLjUpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAgKyB4bGFiKCJOTURTIDEiKSArIHlsYWIoIk5NRFMgMiIpClQyX3JhcmVfcGxvdApnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19vcmRpbmF0aW9uX3JhcmVfVDIucGRmIikKCgpvcmRfdDNfcmFyZTwtb3JkaW5hdGUocGh5c2VxID0gc3Vic2V0X3NhbXBsZXMocHNfcmFyZSwgVGltZT09IlQzIiksIG1ldGhvZCA9ICJOTURTIiwgZGlzdGFuY2UgPSAiYnJheSIsIGs9MywgdHJ5bWF4PSAxMDApClQzX3JhcmU8LWdnb3JkaXBsb3RzOjpnZ19vcmRpcGxvdChvcmQgPSBvcmRfdDNfcmFyZSwgZ3JvdXBzID0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBUaW1lID09ICJUMyIpKSkkSGVyYmljaWRlLCBjaG9pY2VzID0gYygxLCAyKSwga2luZCA9IGMoInNlIiksIGNvbmYgPSAwLjk1LCBzaG93Lmdyb3VwcyA9ICJhbGwiLCBlbGxpcHNlID0gVFJVRSwgbGFiZWwgPSBGQUxTRSwgaHVsbCA9IEZBTFNFLCBzcGlkZXJzID0gRkFMU0UsIHBsb3QgPSBUUlVFLCBwdC5zaXplID0gMSkKVDNfcmFyZV9wbG90PC1UM19yYXJlJHBsb3QgKyB0aGVtZV9jbGFzc2ljKCkgKyB4bGltKC0wLjUsIDAuNSkgKyB5bGltKC0wLjUsIDAuNSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICArIHhsYWIoIk5NRFMgMSIpICsgeWxhYigiTk1EUyAyIikKVDNfcmFyZV9wbG90CgpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19vcmRpbmF0aW9uX3JhcmVfVDMucGRmIikKCmxpYnJhcnkoZ2dwdWJyKQpnZ2FycmFuZ2UoVDFfcmFyZV9wbG90LCBUMl9yYXJlX3Bsb3QsIFQzX3JhcmVfcGxvdCwgbmNvbCA9IDEpCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL0ZpZ3VyZXMvSVRTX2NvbWJpbmVkX29yZGluYXRpb24ucGRmIiwgd2lkdGggPSA1LCBoZWlnaHQgPSAxMCkKYGBgCgpDQVAgb3JkaW5hdGlvbiBwbG90cyByYXJlZmllZApgYGB7I3J9CnQxX2Rpc3QgPC0gZGlzdGFuY2Uoc3Vic2V0X3NhbXBsZXMocHNfcmFyZSwgVGltZT09IlQxIiksIG1ldGhvZD0iYnJheSIpICNnZXQgd1VuaWZyYWMgYW5kIHNhdmUKdDFfdGFibGU8LWFzLm1hdHJpeChkaXN0KHQxX2Rpc3QpKSAjdHJhbnNmb3JtIHdVbmlmcmFjIGluZGV4Cm9yZF90MV9yYXJlX2NhcCA8LSBjYXBzY2FsZSh0MV90YWJsZSB+IEhlcmJpY2lkZSwgZGF0YS5mcmFtZShzYW1wbGVfZGF0YShzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBUaW1lID09ICJUMSIpKSkpClQxX3JhcmU8LWdnb3JkaXBsb3RzOjpnZ19vcmRpcGxvdChvcmQgPSBvcmRfdDFfcmFyZV9jYXAsIGdyb3VwcyA9IGRhdGEuZnJhbWUoc2FtcGxlX2RhdGEoc3Vic2V0X3NhbXBsZXMocHNfcmFyZSwgVGltZSA9PSAiVDEiKSkpJEhlcmJpY2lkZSwgY2hvaWNlcyA9IGMoMSwgMiksIGtpbmQgPSBjKCJzZSIpLCBjb25mID0gMC45NSwgc2hvdy5ncm91cHMgPSAiYWxsIiwgZWxsaXBzZSA9IFRSVUUsIGxhYmVsID0gRkFMU0UsIGh1bGwgPSBGQUxTRSwgc3BpZGVycyA9IEZBTFNFLCBwbG90ID0gVFJVRSwgcHQuc2l6ZSA9IDEpClQxX3JhcmUkcGxvdCArIHRoZW1lX2NsYXNzaWMoKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19vcmRpbmF0aW9uX3JhcmVfVDFfY2FwLnBkZiIpCgoKdDJfZGlzdCA8LSBkaXN0YW5jZShzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBUaW1lPT0iVDIiKSwgbWV0aG9kPSJicmF5IikgI2dldCB3VW5pZnJhYyBhbmQgc2F2ZQp0Ml90YWJsZTwtYXMubWF0cml4KGRpc3QodDJfZGlzdCkpICN0cmFuc2Zvcm0gd1VuaWZyYWMgaW5kZXgKb3JkX3QyX3JhcmVfY2FwIDwtIGNhcHNjYWxlKHQyX3RhYmxlIH4gSGVyYmljaWRlLCBkYXRhLmZyYW1lKHNhbXBsZV9kYXRhKHN1YnNldF9zYW1wbGVzKHBzX3JhcmUsIFRpbWUgPT0gIlQyIikpKSkKVDJfcmFyZTwtZ2dvcmRpcGxvdHM6OmdnX29yZGlwbG90KG9yZCA9IG9yZF90Ml9yYXJlX2NhcCwgZ3JvdXBzID0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBUaW1lID09ICJUMiIpKSkkSGVyYmljaWRlLCBjaG9pY2VzID0gYygxLCAyKSwga2luZCA9IGMoInNlIiksIGNvbmYgPSAwLjk1LCBzaG93Lmdyb3VwcyA9ICJhbGwiLCBlbGxpcHNlID0gVFJVRSwgbGFiZWwgPSBGQUxTRSwgaHVsbCA9IEZBTFNFLCBzcGlkZXJzID0gRkFMU0UsIHBsb3QgPSBUUlVFLCBwdC5zaXplID0gMSkKVDJfcmFyZSRwbG90ICsgdGhlbWVfY2xhc3NpYygpCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL0ZpZ3VyZXMvSVRTX29yZGluYXRpb25fcmFyZV9UMl9jYXAucGRmIikKCgojRzE2NlNHIGlkZW50aWZpZWQgYXMgb3V0bGllciBiYXNlZCBvbiBwbG90cyB3aXRoIGl0IGluY2x1ZGVkLiBSZW1vdmVkIHRvIGNyZWF0ZSBwbG90LiAKcHNfcmFyZSA8LSAgc3Vic2V0X3NhbXBsZXMocHNfcmFyZSwgc2FtcGxlX25hbWVzKHBzX3JhcmUpICE9ICJHMTY2U0ciKQp0M19kaXN0IDwtIGRpc3RhbmNlKHN1YnNldF9zYW1wbGVzKHBzX3JhcmUsIFRpbWU9PSJUMyIpLCBtZXRob2Q9ImJyYXkiKSAjZ2V0IHdVbmlmcmFjIGFuZCBzYXZlCnQzX3RhYmxlPC1hcy5tYXRyaXgoZGlzdCh0M19kaXN0KSkgI3RyYW5zZm9ybSB3VW5pZnJhYyBpbmRleApvcmRfdDNfcmFyZV9jYXAgPC0gY2Fwc2NhbGUodDNfdGFibGUgfiBIZXJiaWNpZGUsIGRhdGEuZnJhbWUoc2FtcGxlX2RhdGEoc3Vic2V0X3NhbXBsZXMocHNfcmFyZSwgVGltZSA9PSAiVDMiKSkpKQpUM19yYXJlPC1nZ29yZGlwbG90czo6Z2dfb3JkaXBsb3Qob3JkID0gb3JkX3QzX3JhcmVfY2FwLCBncm91cHMgPSBkYXRhLmZyYW1lKHNhbXBsZV9kYXRhKHN1YnNldF9zYW1wbGVzKHBzX3JhcmUsIFRpbWUgPT0gIlQzIikpKSRIZXJiaWNpZGUsIGNob2ljZXMgPSBjKDEsIDIpLCBraW5kID0gYygic2UiKSwgY29uZiA9IDAuOTUsIHNob3cuZ3JvdXBzID0gImFsbCIsIGVsbGlwc2UgPSBUUlVFLCBsYWJlbCA9IEZBTFNFLCBodWxsID0gRkFMU0UsIHNwaWRlcnMgPSBGQUxTRSwgcGxvdCA9IFRSVUUsIHB0LnNpemUgPSAxKQpUM19yYXJlJHBsb3QgKyB0aGVtZV9jbGFzc2ljKCkKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfb3JkaW5hdGlvbl9yYXJlX1QzX2NhcC5wZGYiKQoKYGBgCgoKUGFpcndpc2UgYWRvbmlzIHRlc3Rpbmcgbm8gbmVlZGVkIGJlY2FzdWUgb2YgaW5zaWduaWZpY2FudCBnbG9hYmFsIHRlc3QuIApgYGB7I3J9CnBzX3BhaXJ3aXNlYWRvbmlzPC1mdW5jdGlvbihwaHlzZXEpewogIG90dV90YWI8LWRhdGEuZnJhbWUocGh5bG9zZXE6Om90dV90YWJsZShwaHlzZXEpKQogIG1kX3RhYjwtZGF0YS5mcmFtZShwaHlsb3NlcTo6c2FtcGxlX2RhdGEocGh5c2VxKSkKICAgIGlmKHRheGFfYXJlX3Jvd3MocGh5c2VxKT09IFQpewogICAgICAgcGh5c2VxX2Rpc3Q8LXBhcmFsbGVsRGlzdDo6cGFyRGlzdChhcy5tYXRyaXgodChvdHVfdGFiKSksIG1ldGhvZCA9ICJicmF5Iil9CiAgICAgICAgICAgIGVsc2V7cGh5c2VxX2Rpc3Q8LXBhcmFsbGVsRGlzdDo6cGFyRGlzdChhcy5tYXRyaXgob3R1X3RhYiksIG1ldGhvZCA9ICJicmF5Iil9CnBhaXJ3aXNlQWRvbmlzOjpwYWlyd2lzZS5hZG9uaXMoeCA9IHBoeXNlcV9kaXN0LCBmYWN0b3JzID0gbWRfdGFiJEhlcmJpY2lkZSwgcC5hZGp1c3QubSA9ICJub25lIiwgcGVybSA9IDEwMDApCn0KCnBzX3QxPC1zdWJzZXRfc2FtcGxlcyhwc19yYXJlX3N1YiwgVGltZSA9PSAiVDEiKQpwc190MTwtcHJ1bmVfdGF4YSh0YXhhX3N1bXMocHNfdDEpID4gMiwgcHNfdDEpCgpwc190Mjwtc3Vic2V0X3NhbXBsZXMocHNfcmFyZV9zdWIsIFRpbWUgPT0gIlQyIikKcHNfdDI8LXBydW5lX3RheGEodGF4YV9zdW1zKHBzX3QyKSA+IDIsIHBzX3QyKQoKcHNfdDM8LXN1YnNldF9zYW1wbGVzKHBzX3JhcmVfc3ViLCBUaW1lID09ICJUMyIpCnBzX3QzPC1wcnVuZV90YXhhKHRheGFfc3Vtcyhwc190MykgPiAyLCBwc190MykKCgpwc19wYWlyd2lzZWFkb25pcyhwc190MSkKcHNfcGFpcndpc2VhZG9uaXMocHNfdDIpCnBzX3BhaXJ3aXNlYWRvbmlzKHBzX3QzKQpgYGAKClBhaXJ3aXNlIGJldGFkaXNwciBieSB0cmVhdG1lbnQsIHRpbWUgYW5kIG1vZGUKYGBge3J9CnBzX2JldGFkaXNwcjwtZnVuY3Rpb24ocGh5c2VxLCBncm91cGluZ3ZhciA9ICJHcm91cGluZ3ZhciIpewogIG90dV90YWI8LWRhdGEuZnJhbWUocGh5bG9zZXE6Om90dV90YWJsZShwaHlzZXEpKQogIG1kX3RhYjwtZGF0YS5mcmFtZShwaHlsb3NlcTo6c2FtcGxlX2RhdGEocGh5c2VxKSkKICAgIGlmKHRheGFfYXJlX3Jvd3MocGh5c2VxKT09IFQpewogICAgICAgcGh5c2VxX2Rpc3Q8LXBhcmFsbGVsRGlzdDo6cGFyRGlzdChhcy5tYXRyaXgodChvdHVfdGFiKSksIG1ldGhvZCA9ICJicmF5Iil9CiAgICAgICAgICAgIGVsc2V7cGh5c2VxX2Rpc3Q8LXBhcmFsbGVsRGlzdDo6cGFyRGlzdChhcy5tYXRyaXgob3R1X3RhYiksIG1ldGhvZCA9ICJicmF5Iil9CiAgICAgICAgICAgICAgICBtb2Q8LXZlZ2FuOjpiZXRhZGlzcGVyKHBoeXNlcV9kaXN0LCBtZF90YWJbLGdyb3VwaW5ndmFyXSkKICAgICAgICAjIyBQZXJmb3JtIHRlc3QKICAgICAgICAgICAgICAgIHByaW50KGFub3ZhKG1vZCkpCiAgICAgICAgIyMgUGVybXV0YXRpb24gdGVzdCBmb3IgRgogICAgICAgICAgICAgICAgcG1vZCA8LSB2ZWdhbjo6cGVybXV0ZXN0KG1vZCwgcGVybXV0YXRpb25zID0gMTAwMCwgcGFpcndpc2UgPSBUUlVFKQogICAgICAgICAgICAgICAgcHJpbnQocG1vZCkKICAgICAgICAgICAgICAgIHByaW50KGJveHBsb3QobW9kKSkKfQpgYGAKCgpwZXJtdXRlIHRlc3Qgb2YgZGlzcGVyc2lvbiAKYGBge3J9CnBzX2JldGFkaXNwcihzdWJzZXRfc2FtcGxlcyhwc19yYXJlX3N1YiwgVGltZSA9PSAiVDEiKSwgZ3JvdXBpbmd2YXIgPSAiTW9kZSIpCnBzX2JldGFkaXNwcihzdWJzZXRfc2FtcGxlcyhwc19yYXJlX3N1YiwgVGltZSA9PSAiVDIiKSwgZ3JvdXBpbmd2YXIgPSAiTW9kZSIpCnBzX2JldGFkaXNwcihzdWJzZXRfc2FtcGxlcyhwc19yYXJlX3N1YiwgVGltZSA9PSAiVDMiKSwgZ3JvdXBpbmd2YXIgPSAiTW9kZSIpCgpwc19iZXRhZGlzcHIoc3Vic2V0X3NhbXBsZXMocHNfcmFyZV9zdWIsIE1vZGUgPT0gIkNoZW1pY2FsIiksIGdyb3VwaW5ndmFyID0gIlRpbWUiKQpwc19iZXRhZGlzcHIoc3Vic2V0X3NhbXBsZXMocHNfcmFyZV9zdWIsIE1vZGUgPT0gIk5vbi1UcmVhdGVkIiksIGdyb3VwaW5ndmFyID0gIlRpbWUiKQpwc19iZXRhZGlzcHIoc3Vic2V0X3NhbXBsZXMocHNfcmFyZV9zdWIsIE1vZGUgPT0gIkhhbmQiKSwgZ3JvdXBpbmd2YXIgPSAiVGltZSIpCgoKcHNfYmV0YWRpc3ByKHN1YnNldF9zYW1wbGVzKHBzX3JhcmVfc3ViLCBIZXJiaWNpZGUgPT0gIkdseXBob3NhdGUiKSwgZ3JvdXBpbmd2YXIgPSAiVGltZSIpCnBzX2JldGFkaXNwcihzdWJzZXRfc2FtcGxlcyhwc19yYXJlX3N1YiwgSGVyYmljaWRlID09ICJBdHJhemluZS1NZXNvdHJpb25lIiksIGdyb3VwaW5ndmFyID0gIlRpbWUiKQpwc19iZXRhZGlzcHIoc3Vic2V0X3NhbXBsZXMocHNfcmFyZV9zdWIsIEhlcmJpY2lkZSA9PSAiRGljYW1iYSIpLCBncm91cGluZ3ZhciA9ICJUaW1lIikKcHNfYmV0YWRpc3ByKHN1YnNldF9zYW1wbGVzKHBzX3JhcmVfc3ViLCBIZXJiaWNpZGUgPT0gIkhhbmR3ZWVkZWQiKSwgZ3JvdXBpbmd2YXIgPSAiVGltZSIpCnBzX2JldGFkaXNwcihzdWJzZXRfc2FtcGxlcyhwc19yYXJlX3N1YiwgSGVyYmljaWRlID09ICJOb24tVHJlYXRlZCIpLCBncm91cGluZ3ZhciA9ICJUaW1lIikKCnBzX2JldGFkaXNwcihwc19yYXJlX3N1YiwgZ3JvdXBpbmd2YXIgPSAiVGltZSIpCmBgYAoKCkJveCBhbmQgd2hpc2tlciBwbG90cyBvZiBkaXN0YW5jZSAKd2l0aGluIGdyb3VwIGRpc3RhbmNlcwpgYGB7cn0KI3JlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJhbnRvbmlvZ2dzb3VzYS9taWNyVUJJZnVucyIpCmxpYnJhcnkobWljclVCSWZ1bnMpClQxX2JldGE8LWJldGFfYm94cGxvdChwaHlzZXEgPSBzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBUaW1lPT0iVDEiKSwgbWV0aG9kID0gImJyYXkiLCBncm91cCA9ICJIZXJiaWNpZGUiKQpUMV9iZXRhX3Bsb3QgPC0gVDFfYmV0YSRwbG90ClQxX2JldGFfcGxvdCA8LSBUMV9iZXRhX3Bsb3QgKyB0aGVtZV9jbGFzc2ljKCkrIGd1aWRlcyhjb2xvcj1ndWlkZV9sZWdlbmQoIlRyZWF0bWVudCIpKSArIHlsYWIoIkJyYXktQ3VydGlzIERpc3NpbWlsYXJpdHkiKSArIHhsYWIoIiIpICsgdGhlbWUoYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyB5bGltICgwLjMsIDAuNzUpClQxX2JldGFfcGxvdApteV9sZWdlbmQgPC0gZ2V0X2xlZ2VuZChUMV9iZXRhX3Bsb3QpCmFzX2dncGxvdChteV9sZWdlbmQpCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL0ZpZ3VyZXMvSVRTX2JldGFfbGVnZW5kLnBkZiIpClQxX2JldGFfcGxvdDwtVDFfYmV0YV9wbG90KyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpIApUMV9iZXRhX3Bsb3QKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfVDFfcmFyZV93aXRoaW5ncm91cF9iZXRhLnBkZiIpClQxX2JldGFfZGY8LSBUMV9iZXRhJGRhdGEKVDFfYmV0YW1vZDwtYW92KGZvcm11bGEgPSBiZXRhX2Rpdl92YWx1ZSB+IGdyb3VwICxkYXRhID0gVDFfYmV0YV9kZikKc3VtbWFyeShUMV9iZXRhbW9kKQpUdWtleUhTRCh4ID0gVDFfYmV0YW1vZCwgd2hpY2ggPSAiZ3JvdXAiKQoKVDJfYmV0YTwtYmV0YV9ib3hwbG90KHBoeXNlcSA9IHN1YnNldF9zYW1wbGVzKHBzX3JhcmUsIFRpbWU9PSJUMiIpLCBtZXRob2QgPSAiYnJheSIsIGdyb3VwID0gIkhlcmJpY2lkZSIpClQyX2JldGFfcGxvdCA8LSBUMl9iZXRhJHBsb3QKVDJfYmV0YV9wbG90IDwtIFQyX2JldGFfcGxvdCsgdGhlbWVfY2xhc3NpYygpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIHlsYWIoIkJyYXktQ3VydGlzIERpc3NpbWlsYXJpdHkiKSArIHhsYWIoIiIpICsgZ2d0aXRsZSgiIikgKyB0aGVtZShheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKSArIHlsaW0gKDAuMywgMC43NSkKVDJfYmV0YV9wbG90Cmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL0ZpZ3VyZXMvSVRTX1QyX3JhcmVfd2l0aGluZ3JvdXBfYmV0YS5wZGYiKQpUMl9iZXRhX2RmPC0gVDJfYmV0YSRkYXRhClQyX2JldGFtb2Q8LWFvdihmb3JtdWxhID0gYmV0YV9kaXZfdmFsdWUgfiBncm91cCAsZGF0YSA9IFQyX2JldGFfZGYpCnN1bW1hcnkoVDJfYmV0YW1vZCkKVHVrZXlIU0QoeCA9IFQyX2JldGFtb2QsIHdoaWNoID0gImdyb3VwIikKClQzX2JldGE8LWJldGFfYm94cGxvdChwaHlzZXEgPSBzdWJzZXRfc2FtcGxlcyhwc19yYXJlLCBUaW1lPT0iVDMiKSwgbWV0aG9kID0gImJyYXkiLCBncm91cCA9ICJIZXJiaWNpZGUiKSAKVDNfYmV0YSRwbG90ICMrIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjRjg3NjZEIiwgIiNBM0E1MDAiLCAgIiMwMEJGN0QiLCAiIzAwQjBGNiIsICIjRTc2QkYzIikpICsgClQzX2JldGFfcGxvdCA8LSBUM19iZXRhJHBsb3QKVDNfYmV0YV9wbG90IDwtIFQzX2JldGFfcGxvdCArIHRoZW1lX2NsYXNzaWMoKSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIHlsYWIoIkJyYXktQ3VydGlzIERpc3NpbWlsYXJpdHkiKSArIHhsYWIoIiIpICsgZ2d0aXRsZSgiIikKVDNfYmV0YV9wbG90IDwtVDNfYmV0YV9wbG90ICsgdGhlbWUoYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyB5bGltICgwLjMsIDAuNzUpCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL0ZpZ3VyZXMvSVRTX1QzX3JhcmVfd2l0aGluZ3JvdXBfYmV0YS5wZGYiKQoKVDNfYmV0YV9kZjwtIFQzX2JldGEkZGF0YQpUM19iZXRhbW9kPC1hb3YoZm9ybXVsYSA9IGJldGFfZGl2X3ZhbHVlIH4gZ3JvdXAgLGRhdGEgPSBUM19iZXRhX2RmKQpzdW1tYXJ5KFQzX2JldGFtb2QpClR1a2V5SFNEKHggPSBUM19iZXRhbW9kLCB3aGljaCA9ICJncm91cCIpCgpsaWJyYXJ5KGdncHVicikKZ2dhcnJhbmdlKFQxX2JldGFfcGxvdCwgVDJfYmV0YV9wbG90LCBUM19iZXRhX3Bsb3QsIG5jb2wgPSAxKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19jb21iaW5lZF9yYXJlX3dpdGhpbl9ncm91cF9iZXRhLnBkZiIsIHdpZHRoID0gNSwgaGVpZ2h0ID0gMTApCmBgYAoKRXhhbWluYXRpb24gb2YgZGlzc2ltbGlhcml0eSBhY3Jvc3MgdGltZSBwb2ludHMgYnkgdHJlYXRtZW50IGFuZCB0aGVuIGFnYWluIGJ5IGFsbCBjaGVtaWNhbCB0cmVhdG1lbnRzIGNvbWJpbmVkLgpgYGB7cn0KVDFfYmV0YV9kZiRUaW1lPC0iVDEiClQyX2JldGFfZGYkVGltZTwtIlQyIgpUM19iZXRhX2RmJFRpbWU8LSJUMyIKCgpiZXRhX2Rpdl9UMV9UMl9UMyA8LSByYmluZChUMV9iZXRhX2RmLCBUMl9iZXRhX2RmLCBUM19iZXRhX2RmKQoKYmV0YV9hbm92YTwtZnVuY3Rpb24oZGF0YSwgSGVyYmljaWRlID0gIkhlcmJpY2lkZSIpewogIGRmX3N1YjwtIGRhdGEgJT4lIGZpbHRlcihncm91cCA9PSBIZXJiaWNpZGUpCiAgbW9kPC1hb3YoYmV0YV9kaXZfdmFsdWUgfiBUaW1lLCBkYXRhID0gZGZfc3ViKQogIHByaW50KHN1bW1hcnkobW9kKSkKICBwcmludChUdWtleUhTRChtb2QsICJUaW1lIikpCiAgYm94cGxvdChkZl9zdWIkYmV0YV9kaXZfdmFsdWUgfiBkZl9zdWIkVGltZSkKfQoKYmV0YV9hbm92YShiZXRhX2Rpdl9UMV9UMl9UMywgSGVyYmljaWRlID0gIk5vbi1UcmVhdGVkIikKYmV0YV9hbm92YShiZXRhX2Rpdl9UMV9UMl9UMywgSGVyYmljaWRlID0gIkhhbmR3ZWVkZWQiKQpiZXRhX2Fub3ZhKGJldGFfZGl2X1QxX1QyX1QzLCBIZXJiaWNpZGUgPSAiRGljYW1iYSIpCmJldGFfYW5vdmEoYmV0YV9kaXZfVDFfVDJfVDMsIEhlcmJpY2lkZSA9ICJBdHJhemluZS1NZXNvdHJpb25lIikKYmV0YV9hbm92YShiZXRhX2Rpdl9UMV9UMl9UMywgSGVyYmljaWRlID0gIkdseXBob3NhdGUiKQoKI3JlZ3JvdXAgYWxsIGNoZW1pY2FsIHRyZWF0bWVudHMgdG9nZXRoZXIgYW5kIHJlcnVuIGJldGFkaXYgY2FsY3Mgd2l0aGluIGdyb3VwLiAKc2FtcGxlX2RhdGEocHNfcmFyZSkkTW9kZTwtc2FtcGxlX2RhdGEocHNfcmFyZSkkSGVyYmljaWRlCgppbmRleCA8LSBjKCJEaWNhbWJhIiwgIkdseXBob3NhdGUiLCAiQXRyYXppbmUtTWVzb3RyaW9uZSIsICJIYW5kd2VlZGVkIiwgIk5vbi1UcmVhdGVkIikKdmFsdWVzIDwtIGMoIkNoZW1pY2FsIiwgIkNoZW1pY2FsIiwgIkNoZW1pY2FsIiwgIkhhbmR3ZWVkZWQiLCAiTm9uLVRyZWF0ZWQiKQoKc2FtcGxlX2RhdGEocHNfcmFyZSkkTW9kZTwtIGFzLmZhY3Rvcih2YWx1ZXNbbWF0Y2goc2FtcGxlX2RhdGEocHNfcmFyZSkkTW9kZSwgaW5kZXgpXSkKCiMrIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkZBNTAwIiwgIiMwMEIwRjYiLCAiI0U3NkJGMyIpKSAKCgpUMV9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkPC1iZXRhX2JveHBsb3QocGh5c2VxID0gc3Vic2V0X3NhbXBsZXMocHNfcmFyZSwgVGltZT09IlQxIiksIG1ldGhvZCA9ICJicmF5IiwgZ3JvdXAgPSAiTW9kZSIpClQxX2JldGFfY2hlbWljYWxfY29tYmluZWRfcGxvdCA8LSBUMV9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkJHBsb3QgClQxX2JldGFfY2hlbWljYWxfY29tYmluZWRfcGxvdDwtIFQxX2JldGFfY2hlbWljYWxfY29tYmluZWRfcGxvdCArIHRoZW1lX2NsYXNzaWMoKSArIGd1aWRlcyhjb2xvcj1ndWlkZV9sZWdlbmQoIlRyZWF0bWVudCIpKSArIHlsYWIoIkJyYXktQ3VydGlzIERpc3NpbWlsYXJpdHkiKSArIHhsYWIoIiIpICsgdGhlbWUoYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyB5bGltICgwLjUsIDAuNzUpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNGRkE1MDAiLCAiIzAwQjBGNiIsICIjRTc2QkYzIikpIApUMV9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkX3Bsb3QKbXlfbGVnZW5kIDwtIGdldF9sZWdlbmQoVDFfYmV0YV9jaGVtaWNhbF9jb21iaW5lZF9wbG90KQphc19nZ3Bsb3QobXlfbGVnZW5kKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19iZXRhX2NvbWJpbmVkX2xlZ2VuZC5wZGYiKQpUMV9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkX3Bsb3Q8LVQxX2JldGFfY2hlbWljYWxfY29tYmluZWRfcGxvdCsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpUMV9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkX3Bsb3QKCgpUMl9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkPC1iZXRhX2JveHBsb3QocGh5c2VxID0gc3Vic2V0X3NhbXBsZXMocHNfcmFyZSwgVGltZT09IlQyIiksIG1ldGhvZCA9ICJicmF5IiwgZ3JvdXAgPSAiTW9kZSIpClQyX2JldGFfY2hlbWljYWxfY29tYmluZWRfcGxvdCA8LSBUMl9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkJHBsb3QgClQyX2JldGFfY2hlbWljYWxfY29tYmluZWRfcGxvdDwtIFQyX2JldGFfY2hlbWljYWxfY29tYmluZWRfcGxvdCArIHRoZW1lX2NsYXNzaWMoKSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIHlsYWIoIkJyYXktQ3VydGlzIERpc3NpbWlsYXJpdHkiKSArIHhsYWIoIiIpICsgdGhlbWUoYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyB5bGltICgwLjUsIDAuNzUpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNGRkE1MDAiLCAiIzAwQjBGNiIsICIjRTc2QkYzIikpIApUMl9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkX3Bsb3QKCgoKVDNfYmV0YV9jaGVtaWNhbF9jb21iaW5lZDwtYmV0YV9ib3hwbG90KHBoeXNlcSA9IHN1YnNldF9zYW1wbGVzKHBzX3JhcmUsIFRpbWU9PSJUMyIpLCBtZXRob2QgPSAiYnJheSIsIGdyb3VwID0gIk1vZGUiKQpUM19iZXRhX2NoZW1pY2FsX2NvbWJpbmVkX3Bsb3QgPC0gVDNfYmV0YV9jaGVtaWNhbF9jb21iaW5lZCRwbG90IApUM19iZXRhX2NoZW1pY2FsX2NvbWJpbmVkX3Bsb3Q8LSBUM19iZXRhX2NoZW1pY2FsX2NvbWJpbmVkX3Bsb3QgKyB0aGVtZV9jbGFzc2ljKCkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyB5bGFiKCJCcmF5LUN1cnRpcyBEaXNzaW1pbGFyaXR5IikgKyB4bGFiKCIiKSArIHRoZW1lKGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgeWxpbSAoMC41LCAwLjc1KSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkZBNTAwIiwgIiMwMEIwRjYiLCAiI0U3NkJGMyIpKSAKVDNfYmV0YV9jaGVtaWNhbF9jb21iaW5lZF9wbG90CgoKZ2dhcnJhbmdlKFQxX2JldGFfY2hlbWljYWxfY29tYmluZWRfcGxvdCwgVDJfYmV0YV9jaGVtaWNhbF9jb21iaW5lZF9wbG90LCBUM19iZXRhX2NoZW1pY2FsX2NvbWJpbmVkX3Bsb3QsIG5jb2wgPSAxKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19jb21iaW5lZF9yYXJlX3dpdGhpbl9ncm91cF9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkLnBkZiIsIHdpZHRoID0gNSwgaGVpZ2h0ID0gMTApCmBgYAoKCmBgYHtyfQoKVDFfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZCA8LSBUMV9iZXRhX2NoZW1pY2FsX2NvbWJpbmVkJGRhdGEKVDJfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZDwtIFQyX2JldGFfY2hlbWljYWxfY29tYmluZWQkZGF0YQpUM19iZXRhX2RmX2NoZW1pY2FsX2NvbWJpbmVkPC0gVDNfYmV0YV9jaGVtaWNhbF9jb21iaW5lZCRkYXRhCgpUMV9iZXRhX2RmX2NoZW1pY2FsX2NvbWJpbmVkJFRpbWU8LSJUMSIKVDJfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZCRUaW1lPC0iVDIiClQzX2JldGFfZGZfY2hlbWljYWxfY29tYmluZWQkVGltZTwtIlQzIgoKbTE8LWFvdihiZXRhX2Rpdl92YWx1ZSB+IGdyb3VwLCBkYXRhID0gVDFfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZCkKc3VtbWFyeShtMSkKVHVrZXlIU0QobTEsICJncm91cCIpCmJveHBsb3QoYmV0YV9kaXZfdmFsdWUgfiBncm91cCwgZGF0YSA9IFQxX2JldGFfZGZfY2hlbWljYWxfY29tYmluZWQpCgoKbTI8LWFvdihiZXRhX2Rpdl92YWx1ZSB+IGdyb3VwLCBkYXRhID0gVDJfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZCkKc3VtbWFyeShtMikKVHVrZXlIU0QobTIsICJncm91cCIpCmJveHBsb3QoYmV0YV9kaXZfdmFsdWUgfiBncm91cCwgZGF0YSA9IFQyX2JldGFfZGZfY2hlbWljYWxfY29tYmluZWQpCgptMzwtYW92KGJldGFfZGl2X3ZhbHVlIH4gZ3JvdXAsIGRhdGEgPSBUM19iZXRhX2RmX2NoZW1pY2FsX2NvbWJpbmVkKQpzdW1tYXJ5KG0zKQpUdWtleUhTRChtMywgImdyb3VwIikKYm94cGxvdChiZXRhX2Rpdl92YWx1ZSB+IGdyb3VwLCBkYXRhID0gVDNfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZCkKCgpiZXRhX2Rpdl9fY2hlbWljYWxfY29tYmluZWRfVDFfVDJfVDMgPC0gcmJpbmQoVDFfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZCwgVDJfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZCwgVDNfYmV0YV9kZl9jaGVtaWNhbF9jb21iaW5lZCkKCmJldGFfYW5vdmEoYmV0YV9kaXZfX2NoZW1pY2FsX2NvbWJpbmVkX1QxX1QyX1QzLCBIZXJiaWNpZGUgPSAiQ2hlbWljYWwiKQpiZXRhX2Fub3ZhKGJldGFfZGl2X19jaGVtaWNhbF9jb21iaW5lZF9UMV9UMl9UMywgSGVyYmljaWRlID0gIkhhbmQiKQpiZXRhX2Fub3ZhKGJldGFfZGl2X19jaGVtaWNhbF9jb21iaW5lZF9UMV9UMl9UMywgSGVyYmljaWRlID0gIk5vbi1UcmVhdGVkIikKYGBgCgp0cmVhdG1lbnQgdG8gY29udHJvbCAKYGBge3J9CgoKcGxvdERpc3RhbmNlcyA9IGZ1bmN0aW9uKHAsIG0sIHMsIGQpIHsKCiAgIyBjYWxjIGRpc3RhbmNlcwogIHd1ID0gcGh5bG9zZXE6OmRpc3RhbmNlKHAsIG0pCiAgd3UubSA9IG1lbHQoYXMubWF0cml4KHd1KSkKICAKICAjIHJlbW92ZSBzZWxmLWNvbXBhcmlzb25zCiAgd3UubSA9IHd1Lm0gJT4lCiAgICBmaWx0ZXIoYXMuY2hhcmFjdGVyKFZhcjEpICE9IGFzLmNoYXJhY3RlcihWYXIyKSkgJT4lCiAgICBtdXRhdGVfaWYoaXMuZmFjdG9yLGFzLmNoYXJhY3RlcikKICAKICAjIGdldCBzYW1wbGUgZGF0YSAoUzQgZXJyb3IgT0sgYW5kIGV4cGVjdGVkKQogIHNkID0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShwKSkgJT4lCiAgICBzZWxlY3QocywgZCkgJT4lCiAgICBtdXRhdGVfaWYoaXMuZmFjdG9yLGFzLmNoYXJhY3RlcikKICBzZCRIZXJiaWNpZGUgPC0gZmFjdG9yKHNkJEhlcmJpY2lkZSwgbGV2ZWxzID0gYygiTm9uLVRyZWF0ZWQiLCAiSGFuZCIsICJBYXRyZXgiLCAiQ2xhcml0eSIsICJSb3VuZHVwIFBvd2VybWF4IikpCiAgCiAgIyBjb21iaW5lZCBkaXN0YW5jZXMgd2l0aCBzYW1wbGUgZGF0YQogIGNvbG5hbWVzKHNkKSA9IGMoIlZhcjEiLCAiVHlwZTEiKQogIHd1LnNkID0gbGVmdF9qb2luKHd1Lm0sIHNkLCBieSA9ICJWYXIxIikKICAKICBjb2xuYW1lcyhzZCkgPSBjKCJWYXIyIiwgIlR5cGUyIikKICB3dS5zZCA9IGxlZnRfam9pbih3dS5zZCwgc2QsIGJ5ID0gIlZhcjIiKQogIAogICNyZW1vdmUgdGhpcyBsaW5lIHRvIHBsb3QgYWxsIGNvbXBhcmlzb25zLiAKICB3dS5zZCA9IHd1LnNkICU+JSBmaWx0ZXIoVHlwZTEgPT0gIkhhbmQiIHwgVHlwZTEgPT0gIk5vbi1UcmVhdGVkIikKICAKICAjIHBsb3QKICBnZ3Bsb3Qod3Uuc2QsIGFlcyh4ID0gVHlwZTIsIHkgPSB2YWx1ZSkpICsKICAgIHRoZW1lX2J3KCkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGdlb21fYm94cGxvdChhZXMoY29sb3IgPSBpZmVsc2UoVHlwZTEgPT0gVHlwZTIsICJyZWQiLCAiYmxhY2siKSkpICsKICAgIHNjYWxlX2NvbG9yX2lkZW50aXR5KCkgKwogICAgZmFjZXRfd3JhcCh+IFR5cGUxLCBzY2FsZXMgPSAiZnJlZV94IikgKwogICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDUpKSArIAogICAgZ2d0aXRsZShwYXN0ZTAoIkRpc3RhbmNlIE1ldHJpYyA9ICIsIG0pKQogIAp9CmBgYAoKCmBgYHtyfQphPC1wbG90RGlzdGFuY2VzKHAgPSBzdWJzZXRfc2FtcGxlcyhwaHlzZXE9IHBzX3JhcmUsIFRpbWU9PSJUMSIpLCBtID0gImJyYXkiLCBzID0gIkJhcmNvZGVfSURfRyIsIGQgPSAiSGVyYmljaWRlIikKYSA8LSBhICsgZ2d0aXRsZSgiVGltZSAxIEJyYXktQ3VydGlzIERpc3NpbWxhcml0aWVzIikKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfVDFfcmFyZV9hbGxncm91cF9iZXRhLnBkZiIpCmI8LXBsb3REaXN0YW5jZXMocCA9IHN1YnNldF9zYW1wbGVzKHBoeXNlcT0gcHNfcmFyZSwgVGltZT09IlQyIiksIG0gPSAiYnJheSIsIHMgPSAiQmFyY29kZV9JRF9HIiwgZCA9ICJIZXJiaWNpZGUiKQpiIDwtYiArIGdndGl0bGUoIlRpbWUgMiBCcmF5LUN1cnRpcyBEaXNzaW1sYXJpdGllcyIpCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL0ZpZ3VyZXMvSVRTX1QyX3JhcmVfYWxsZ3JvdXBfYmV0YS5wZGYiKQpjPC1wbG90RGlzdGFuY2VzKHAgPSBzdWJzZXRfc2FtcGxlcyhwaHlzZXE9IHBzX3JhcmUsIFRpbWU9PSJUMyIpLCBtID0gImJyYXkiLCBzID0gIkJhcmNvZGVfSURfRyIsIGQgPSAiSGVyYmljaWRlIikKYzwtIGMgKyBnZ3RpdGxlKCJUaW1lIDMgQnJheS1DdXJ0aXMgRGlzc2ltbGFyaXRpZXMiKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19UM19yYXJlX2FsbGdyb3VwX2JldGEucGRmIikKCmxpYnJhcnkoZ2dwdWJyKQpnZ2FycmFuZ2UoYSwgYiwgYywgbmNvbCA9IDEpCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUFQxL0ZpZ3VyZXMvSVRTX2NvbWJpbmVkX3JhcmVfYWxsZ3JvdXBfYmV0YS5wZGYiLCB3aWR0aCA9IDcsIGhlaWdodCA9IDEyKQpgYGAKVGF4b24gYWJ1bmRhbmNlIGJhciBwbG90CgpgYGB7cn0KI2NyZWF0ZSBzdXBlciBsb25nIGNvbG9yIHZlY3Rvcgpjb2xfdmVjdG9yIDwtIGMoIiMwMDAwMDAiLCAiI0ZGRkYwMCIsICIjMUNFNkZGIiwgIiNGRjM0RkYiLCAiI0ZGNEE0NiIsICIjMDA4OTQxIiwgIiMwMDZGQTYiLCAiI0EzMDA1OSIsCiAgICAgICAgIiNGRkRCRTUiLCAiIzdBNDkwMCIsICIjMDAwMEE2IiwgIiM2M0ZGQUMiLCAiI0I3OTc2MiIsICIjMDA0RDQzIiwgIiM4RkIwRkYiLCAiIzk5N0Q4NyIsCiAgICAgICAgIiM1QTAwMDciLCAiIzgwOTY5MyIsICIjRkVGRkU2IiwgIiMxQjQ0MDAiLCAiIzRGQzYwMSIsICIjM0I1REZGIiwgIiM0QTNCNTMiLCAiI0ZGMkY4MCIsCiAgICAgICAgIiM2MTYxNUEiLCAiI0JBMDkwMCIsICIjNkI3OTAwIiwgIiMwMEMyQTAiLCAiI0ZGQUE5MiIsICIjRkY5MEM5IiwgIiNCOTAzQUEiLCAiI0QxNjEwMCIsCiAgICAgICAgIiNEREVGRkYiLCAiIzAwMDAzNSIsICIjN0I0RjRCIiwgIiNBMUMyOTkiLCAiIzMwMDAxOCIsICIjMEFBNkQ4IiwgIiMwMTMzNDkiLCAiIzAwODQ2RiIsCiAgICAgICAgIiMzNzIxMDEiLCAiI0ZGQjUwMCIsICIjQzJGRkVEIiwgIiNBMDc5QkYiLCAiI0NDMDc0NCIsICIjQzBCOUIyIiwgIiNDMkZGOTkiLCAiIzAwMUUwOSIsCiAgICAgICAgIiMwMDQ4OUMiLCAiIzZGMDA2MiIsICIjMENCRDY2IiwgIiNFRUMzRkYiLCAiIzQ1NkQ3NSIsICIjQjc3QjY4IiwgIiM3QTg3QTEiLCAiIzc4OEQ2NiIsCiAgICAgICAgIiM4ODU1NzgiLCAiI0ZBRDA5RiIsICIjRkY4QTlBIiwgIiNEMTU3QTAiLCAiI0JFQzQ1OSIsICIjNDU2NjQ4IiwgIiMwMDg2RUQiLCAiIzg4NkY0QyIsCiAgICAgICAgCiAgICAgICAgIiMzNDM2MkQiLCAiI0I0QThCRCIsICIjMDBBNkFBIiwgIiM0NTJDMkMiLCAiIzYzNjM3NSIsICIjQTNDOEM5IiwgIiNGRjkxM0YiLCAiIzkzOEE4MSIsCiAgICAgICAgIiM1NzUzMjkiLCAiIzAwRkVDRiIsICIjQjA1QjZGIiwgIiM4Q0QwRkYiLCAiIzNCOTcwMCIsICIjMDRGNzU3IiwgIiNDOEExQTEiLCAiIzFFNkUwMCIsCiAgICAgICAgIiM3OTAwRDciLCAiI0E3NzUwMCIsICIjNjM2N0E5IiwgIiNBMDU4MzciLCAiIzZCMDAyQyIsICIjNzcyNjAwIiwgIiNENzkwRkYiLCAiIzlCOTcwMCIsCiAgICAgICAgIiM1NDlFNzkiLCAiI0ZGRjY5RiIsICIjMjAxNjI1IiwgIiM3MjQxOEYiLCAiI0JDMjNGRiIsICIjOTlBREMwIiwgIiMzQTI0NjUiLCAiIzkyMjMyOSIsCiAgICAgICAgIiM1QjQ1MzQiLCAiI0ZERThEQyIsICIjNDA0RTU1IiwgIiMwMDg5QTMiLCAiI0NCN0U5OCIsICIjQTRFODA0IiwgIiMzMjRFNzIiLCAiIzZBM0E0QyIsCiAgICAgICAgIiM4M0FCNTgiLCAiIzAwMUMxRSIsICIjRDFGN0NFIiwgIiMwMDRCMjgiLCAiI0M4RDBGNiIsICIjQTNBNDg5IiwgIiM4MDZDNjYiLCAiIzIyMjgwMCIsCiAgICAgICAgIiNCRjU2NTAiLCAiI0U4MzAwMCIsICIjNjY3OTZEIiwgIiNEQTAwN0MiLCAiI0ZGMUE1OSIsICIjOEFEQkI0IiwgIiMxRTAyMDAiLCAiIzVCNEU1MSIsCiAgICAgICAgIiNDODk1QzUiLCAiIzMyMDAzMyIsICIjRkY2ODMyIiwgIiM2NkUxRDMiLCAiI0NGQ0RBQyIsICIjRDBBQzk0IiwgIiM3RUQzNzkiLCAiIzAxMkM1OCIsCiAgICAgICAgCiAgICAgICAgIiM3QTdCRkYiLCAiI0Q2OEUwMSIsICIjMzUzMzM5IiwgIiM3OEFGQTEiLCAiI0ZFQjJDNiIsICIjNzU3OTdDIiwgIiM4MzczOTMiLCAiIzk0M0E0RCIsCiAgICAgICAgIiNCNUY0RkYiLCAiI0QyRENENSIsICIjOTU1NkJEIiwgIiM2QTcxNEEiLCAiIzAwMTMyNSIsICIjMDI1MjVGIiwgIiMwQUEzRjciLCAiI0U5ODE3NiIsCiAgICAgICAgIiNEQkQ1REQiLCAiIzVFQkNEMSIsICIjM0Q0RjQ0IiwgIiM3RTY0MDUiLCAiIzAyNjg0RSIsICIjOTYyQjc1IiwgIiM4RDg1NDYiLCAiIzk2OTVDNSIsCiAgICAgICAgIiNFNzczQ0UiLCAiI0Q4NkE3OCIsICIjM0U4OUJFIiwgIiNDQTgzNEUiLCAiIzUxOEE4NyIsICIjNUIxMTNDIiwgIiM1NTgxM0IiLCAiI0U3MDRDNCIsCiAgICAgICAgIiMwMDAwNUYiLCAiI0E5NzM5OSIsICIjNEI4MTYwIiwgIiM1OTczOEEiLCAiI0ZGNURBNyIsICIjRjdDOUJGIiwgIiM2NDMxMjciLCAiIzUxM0EwMSIsCiAgICAgICAgIiM2Qjk0QUEiLCAiIzUxQTA1OCIsICIjQTQ1QjAyIiwgIiMxRDE3MDIiLCAiI0UyMDAyNyIsICIjRTdBQjYzIiwgIiM0QzYwMDEiLCAiIzlDNjk2NiIsCiAgICAgICAgIiM2NDU0N0IiLCAiIzk3OTc5RSIsICIjMDA2QTY2IiwgIiMzOTE0MDYiLCAiI0Y0RDc0OSIsICIjMDA0NUQyIiwgIiMwMDZDMzEiLCAiI0REQjZEMCIsCiAgICAgICAgIiM3QzY1NzEiLCAiIzlGQjJBNCIsICIjMDBEODkxIiwgIiMxNUEwOEEiLCAiI0JDNjVFOSIsICIjRkZGRkZFIiwgIiNDNkRDOTkiLCAiIzIwM0IzQyIsCgogICAgICAgICIjNjcxMTkwIiwgIiM2QjNBNjQiLCAiI0Y1RTFGRiIsICIjRkZBMEYyIiwgIiNDQ0FBMzUiLCAiIzM3NDUyNyIsICIjOEJCNDAwIiwgIiM3OTc4NjgiLAogICAgICAgICIjQzYwMDVBIiwgIiMzQjAwMEEiLCAiI0M4NjI0MCIsICIjMjk2MDdDIiwgIiM0MDIzMzQiLCAiIzdENUE0NCIsICIjQ0NCODdDIiwgIiNCODgxODMiLAogICAgICAgICIjQUE1MTk5IiwgIiNCNUQ2QzMiLCAiI0EzODQ2OSIsICIjOUY5NEYwIiwgIiNBNzQ1NzEiLCAiI0I4OTRBNiIsICIjNzFCQjhDIiwgIiMwMEI0MzMiLAogICAgICAgICIjNzg5RUM5IiwgIiM2RDgwQkEiLCAiIzk1M0YwMCIsICIjNUVGRjAzIiwgIiNFNEZGRkMiLCAiIzFCRTE3NyIsICIjQkNCMUU1IiwgIiM3NjkxMkYiLAogICAgICAgICIjMDAzMTA5IiwgIiMwMDYwQ0QiLCAiI0QyMDA5NiIsICIjODk1NTYzIiwgIiMyOTIwMUQiLCAiIzVCMzIxMyIsICIjQTc2RjQyIiwgIiM4OTQxMkUiLAogICAgICAgICIjMUEzQTJBIiwgIiM0OTRCNUEiLCAiI0E4OEM4NSIsICIjRjRBQkFBIiwgIiNBM0YzQUIiLCAiIzAwQzZDOCIsICIjRUE4QjY2IiwgIiM5NThBOUYiLAogICAgICAgICIjQkRDOUQyIiwgIiM5RkEwNjQiLCAiI0JFNDcwMCIsICIjNjU4MTg4IiwgIiM4M0E0ODUiLCAiIzQ1M0MyMyIsICIjNDc2NzVEIiwgIiMzQTNGMDAiLAogICAgICAgICIjMDYxMjAzIiwgIiNERkZCNzEiLCAiIzg2OEU3RSIsICIjOThEMDU4IiwgIiM2QzhGN0QiLCAiI0Q3QkZDMiIsICIjM0MzRTZFIiwgIiNEODNENjYiLAoKICAgICAgICAiIzJGNUQ5QiIsICIjNkM1RTQ2IiwgIiNEMjVCODgiLCAiIzVCNjU2QyIsICIjMDBCNTdGIiwgIiM1NDVDNDYiLCAiIzg2NjA5NyIsICIjMzY1RDI1IiwKICAgICAgICAiIzI1MkY5OSIsICIjMDBDQ0ZGIiwgIiM2NzRFNjAiLCAiI0ZDMDA5QyIsICIjOTI4OTZCIikKYGBgCgpgYGB7cn0KcGh5bHVtR2xvbW1lZCA8LSB0YXhfZ2xvbShwc19yYXJlLCAiUGh5bHVtIikKCiN0MQpwaHlsdW1HbG9tbWVkX2hlcmJfdDEgPC0gbWVyZ2Vfc2FtcGxlcyhzdWJzZXRfc2FtcGxlcyhwaHlzZXE9IHBoeWx1bUdsb21tZWQsIFRpbWU9PSJUMSIpLCBncm91cCA9ICJIZXJiaWNpZGUiKQpwaHlsdW1HbG9tbWVkX2hlcmJfdDEgPC0gdHJhbnNmb3JtX3NhbXBsZV9jb3VudHMocGh5bHVtR2xvbW1lZF9oZXJiX3QxLCBmdW5jdGlvbihPVFUpIE9UVS9zdW0oT1RVKSkKc2FtcGxlX2RhdGEocGh5bHVtR2xvbW1lZF9oZXJiX3QxKSRIZXJiaWNpZGUgPC0gZmFjdG9yKHNhbXBsZV9kYXRhKHBoeWx1bUdsb21tZWRfaGVyYl90MSkkSGVyYmljaWRlLCBsZXZlbHMgPSBjKDEsIDIsIDMsIDQsIDUpLCAKICAgICAgIGxhYmVscyA9IGMoIk5vbi1UcmVhdGVkIiwgIkhhbmQiLCAiQWF0cmV4IiwgIkNsYXJpdHkiLCAiUm91bmR1cCBQb3dlcm1heCIpKQoKcGxvdF9iYXIocGh5bHVtR2xvbW1lZF9oZXJiX3QxLCB4ID0gIkhlcmJpY2lkZSIsIGZpbGwgPSAiUGh5bHVtIikgICsgdGhlbWVfY2xhc3NpYygpICsgZ2d0aXRsZSgiUHJvcG9ydGlvbmFsIFRheG9uIEFidW5kYW5jZXMgVGltZSAxIikgKwp0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsgZ3VpZGVzKGZpbGw9Z3VpZGVfbGVnZW5kKG5yb3c9NikpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSA1KSkgKyAKc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sX3ZlY3RvcikKZ2dzYXZlKCIvVXNlcnMvZ29yZG9uY3VzdGVyL0Rlc2t0b3AvR2l0X1Byb2plY3RzL0hlcmJpY2lkZV9NaWNyb2Jlc19QVDEvRmlndXJlcy9JVFNfVGF4b25fYmFycGxvdF90MS5wZGYiKQoKI3QyCnBoeWx1bUdsb21tZWRfaGVyYl90MiA8LSBtZXJnZV9zYW1wbGVzKHN1YnNldF9zYW1wbGVzKHBoeXNlcT0gcGh5bHVtR2xvbW1lZCwgVGltZT09IlQyIiksIGdyb3VwID0gIkhlcmJpY2lkZSIpCnBoeWx1bUdsb21tZWRfaGVyYl90MiA8LSB0cmFuc2Zvcm1fc2FtcGxlX2NvdW50cyhwaHlsdW1HbG9tbWVkX2hlcmJfdDIsIGZ1bmN0aW9uKE9UVSkgT1RVL3N1bShPVFUpKQpzYW1wbGVfZGF0YShwaHlsdW1HbG9tbWVkX2hlcmJfdDIpJEhlcmJpY2lkZSA8LSBmYWN0b3Ioc2FtcGxlX2RhdGEocGh5bHVtR2xvbW1lZF9oZXJiX3QyKSRIZXJiaWNpZGUsIGxldmVscyA9IGMoMSwgMiwgMywgNCwgNSksIAogICAgICAgbGFiZWxzID0gYygiTm9uLVRyZWF0ZWQiLCAiSGFuZCIsICJBYXRyZXgiLCAiQ2xhcml0eSIsICJSb3VuZHVwIFBvd2VybWF4IikpCgpwbG90X2JhcihwaHlsdW1HbG9tbWVkX2hlcmJfdDIsIHggPSAiSGVyYmljaWRlIiwgZmlsbCA9ICJQaHlsdW0iKSAgKyB0aGVtZV9jbGFzc2ljKCkgKyBnZ3RpdGxlKCJQcm9wb3J0aW9uYWwgVGF4b24gQWJ1bmRhbmNlcyBUaW1lIDEiKSArCnRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKyBndWlkZXMoZmlsbD1ndWlkZV9sZWdlbmQobnJvdz02KSkgKyBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDUpKSArIApzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xfdmVjdG9yKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1B0MS9GaWd1cmVzL0lUU19UYXhvbl9iYXJwbG90X3QyLnBkZiIpCgojdDMKcGh5bHVtR2xvbW1lZF9oZXJiX3QzIDwtIG1lcmdlX3NhbXBsZXMoc3Vic2V0X3NhbXBsZXMocGh5c2VxPSBwaHlsdW1HbG9tbWVkLCBUaW1lPT0iVDMiKSwgZ3JvdXAgPSAiSGVyYmljaWRlIikKcGh5bHVtR2xvbW1lZF9oZXJiX3QzIDwtIHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKHBoeWx1bUdsb21tZWRfaGVyYl90MywgZnVuY3Rpb24oT1RVKSBPVFUvc3VtKE9UVSkpCnNhbXBsZV9kYXRhKHBoeWx1bUdsb21tZWRfaGVyYl90MykkSGVyYmljaWRlIDwtIGZhY3RvcihzYW1wbGVfZGF0YShwaHlsdW1HbG9tbWVkX2hlcmJfdDMpJEhlcmJpY2lkZSwgbGV2ZWxzID0gYygxLCAyLCAzLCA0LCA1KSwgCiAgICAgICBsYWJlbHMgPSBjKCJOb24tVHJlYXRlZCIsICJIYW5kIiwgIkFhdHJleCIsICJDbGFyaXR5IiwgIlJvdW5kdXAgUG93ZXJtYXgiKSkKCnBsb3RfYmFyKHBoeWx1bUdsb21tZWRfaGVyYl90MywgeCA9ICJIZXJiaWNpZGUiLCBmaWxsID0gIlBoeWx1bSIpICArIHRoZW1lX2NsYXNzaWMoKSArIGdndGl0bGUoIlByb3BvcnRpb25hbCBUYXhvbiBBYnVuZGFuY2VzIFRpbWUgMSIpICsKdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArIGd1aWRlcyhmaWxsPWd1aWRlX2xlZ2VuZChucm93PTYpKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKyB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gNSkpICsgCnNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbF92ZWN0b3IpCmdnc2F2ZSgiL1VzZXJzL2dvcmRvbmN1c3Rlci9EZXNrdG9wL0dpdF9Qcm9qZWN0cy9IZXJiaWNpZGVfTWljcm9iZXNfUHQxL0ZpZ3VyZXMvSVRTX1RheG9uX2JhcnBsb3RfdDMucGRmIikKYGBgCgpDb21iaW5lZCBoZXJiaWNpZGUgYW5kIHRpbWUgYmFyIHBsb3QKYGBge3J9CnNhbXBsZV9kYXRhKHBzX3JhcmVfc3ViKSRoZXJiX3RpbWU8LXBhc3RlKHNhbXBsZV9kYXRhKHBzX3JhcmVfc3ViKSRIZXJiaWNpZGUsIHNhbXBsZV9kYXRhKHBzX3JhcmVfc3ViKSRUaW1lLCBzZXAgPSAiXyIpCnBzX3JhcmVfZm9yX2JhcnBsb3QgPC0gcHJ1bmVfdGF4YSh0YXhhX3N1bXMocHNfcmFyZV9zdWIpID4gNTAsIHBzX3JhcmVfc3ViKQpwbG90X2Jhcihwc19yYXJlX2Zvcl9iYXJwbG90LCB4PSAiaGVyYl90aW1lIiwgZmlsbCA9ICJGYW1pbHkiKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbF92ZWN0b3IpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKQpnZ3NhdmUoIi9Vc2Vycy9nb3Jkb25jdXN0ZXIvRGVza3RvcC9HaXRfUHJvamVjdHMvSGVyYmljaWRlX01pY3JvYmVzX1BUMS9GaWd1cmVzL0lUU19CYXJQbG90X0hlcmJpY2lkZV9UaW1lLnBkZiIsIHdpZHRoID0gMjAsIGhlaWdodCA9IDExKQpgYGAKCkxpbmVhciBtb2RlbGluZyBvZiBhYnVuZGFudCB0YXhhCmBgYHtyfQoKVGF4X2dsb21fU3Vic2V0IDwtIGZ1bmN0aW9uIChwaHlzZXEsIHkgPSAidGF4TGV2ZWwiLCBucmV0dXJucyA9ICJOdW1iZXIgb2YgcmV0dXJucyIpewogICBwc18xPC0gdGF4X2dsb20ocHNfcmFyZV9zdWIsIHRheHJhbmsgPSB5ICkKICAgIG15VGF4YSA8LSBuYW1lcyhzb3J0KHRheGFfc3Vtcyhwc18xKSwgZGVjcmVhc2luZyA9IFRSVUUpWzE6bnJldHVybnNdKQogICAgICAgcHNfMV9zdWIgPC0gcHJ1bmVfdGF4YShteVRheGEsIHBzXzEpCiAgcmV0dXJuKHBzXzFfc3ViKQp9Cgpwc19yYXJlX2ZhbWlseV90b3AyNTwtVGF4X2dsb21fU3Vic2V0KHBoeXNlcSA9IHBzX3JhcmUsIG5yZXR1cm5zID0gMjUsIHkgPSAiRmFtaWx5IikKcHNfcmFyZV9vcmRlcl90b3AxMDwtVGF4X2dsb21fU3Vic2V0KHBoeXNlcSA9IHBzX3JhcmUsIG5yZXR1cm5zID0gMTAsIHkgPSAiT3JkZXIiKQoKI2V4cGxvcmUgdG9wIDI1IHRheGEgd2l0aCBwbG90IGJhcgpwbG90X2Jhcihwc19yYXJlX2ZhbWlseV90b3AyNSwgeD0gImhlcmJfdGltZSIsIGZpbGwgPSAiRmFtaWx5IikgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xfdmVjdG9yKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikKcGxvdF9iYXIocHNfcmFyZV9vcmRlcl90b3AxMCwgeD0gImhlcmJfdGltZSIsIGZpbGwgPSAiT3JkZXIiKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbF92ZWN0b3IpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKQoKCiN3cml0ZSBmdW5jdGlvbiB0byB3cmFuZ2xlIGRhdGEgcHJpb3IgdG8gYW5vdmEKCmFidW5kX2Fvdl93cmFuZ2xlIDwtIGZ1bmN0aW9uIChwaHlzZXEsIHkgPSAiVGF4X0xldmVsIil7CiAgdGF4PC10YXhfdGFibGUocGh5c2VxKVsseV0KICAgbWV0YTwtZGF0YS5mcmFtZShzYW1wbGVfZGF0YShwaHlzZXEpKQogIGNvdW50czwtZGF0YS5mcmFtZShvdHVfdGFibGUocGh5c2VxKSkKICByb3duYW1lcyhjb3VudHMpIDwtIHRheFssMV0KICBjb3VudHM8LWRhdGEuZnJhbWUodChjb3VudHMpKQogICBjb3VudHMkVGltZSA8LSBtZXRhJFRpbWUgCiAgIGNvdW50cyRIZXJiaWNpZGUgPC0gbWV0YSRIZXJiaWNpZGUgCiAgY291bnRzJEhlcmJfdGltZSA8LSBtZXRhJGhlcmJfdGltZSAKICByZXR1cm4oY291bnRzKQp9ICAgICAgICAgICAgCgp0ZXN0PC1hYnVuZF9hb3Zfd3JhbmdsZShwc19yYXJlX2ZhbWlseV90b3AyNSwgeSA9ICJGYW1pbHkiKQoKbW9kX2FidW5kPC1mdW5jdGlvbihjb3VudF90YWIsIElWID0gIkdyb3VwcyB0byBiZSB0ZXN0ZWQiKSB7CiAgIGZvcihqIGluIDE6bGVuZ3RoKHVuaXF1ZShjb3VudF90YWJbLCJIZXJiaWNpZGUiXSkpKXsKICAgICAgICAgZGF0YSA8LSBjb3VudF90YWIgJT4lIGZpbHRlcihIZXJiaWNpZGUgPT0gdW5pcXVlKGNvdW50X3RhYiRIZXJiaWNpZGUpW2pdKQogICAgICAgICAgICNjaGFuZ2UgdGhpcyB0byB0aGUgbnVtYmVyIG9mIHJldHVybnMgZnJvbSB0aGUgdGF4X2dsb21fc3Vic2V0IGZ1bmN0aW9uCiAgIGZvciAoaSBpbiAxOjI1KSB7IAogICAgICAgICAgICBtb2QgPC0gYW92KHVubGlzdChkYXRhW2ldKSB+IG1hdHJpeChkYXRhWyxJVl0pKSAKICAgICAgICAgICAgI3Nhbml0eSBjaGVjawogICAgICAgICAgICAjcHJpbnQoYyhqLCBpKSkKICAgaWYoc3VtbWFyeShtb2QpW1sxXV1bWyJQcig+RikiXV1bMV0gPD0gMC4wNSkgewogICAgcHJpbnQoc3VtbWFyeShtb2QpKQogICAgIHByaW50KGMoYXMuY2hhcmFjdGVyKHVuaXF1ZShjb3VudF90YWJbLCJIZXJiaWNpZGUiXSkpW2pdLCBuYW1lcyhkYXRhKVtpXSkpCiAgICAgICAgICAgICAgYm94cGxvdCh1bmxpc3QoZGF0YVtpXSkgfiB1bmxpc3QoZGF0YVtJVl0pLCBtYWluID1wYXN0ZShuYW1lcyhkYXRhW2ldKSwgYXMuY2hhcmFjdGVyKHVuaXF1ZShjb3VudF90YWJbLCJIZXJiaWNpZGUiXSkpW2pdKSwgeGxhYj0gIlRpbWUiLCB5bGFiPSJBYnVuZGFuY2UiKSAKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgfQoKCm1vZF9hYnVuZCh0ZXN0LCBJViA9ICJUaW1lIikKCgojZXhwbG9yZSAKcHNfcmFyZV9jZXJ0YWJvc2lkaWFjYWUgPC0gc3Vic2V0X3RheGEocHNfcmFyZSwgRmFtaWx5ID09ICJmOkNlcmF0b2Jhc2lkaWFjZWFlIikKcGxvdF9iYXIocHNfcmFyZV9jZXJ0YWJvc2lkaWFjYWUsIHg9ICJoZXJiX3RpbWUiKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbF92ZWN0b3IpCmBgYAo=